Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 3

Автор: RomanTim
Дата сообщения: 09.06.2007 16:06
GreatOne
Вроде никогда не было проблем с количеством строк...
Попробуй поставить брекпойнт на строчку Form3.StringGrid1.RowCount:=Form3.StringGrid1.RowCount+1 и последить - меняется ликоличество строк после 128.

Ну и для упрощения алгоритма - раз ты в грид помещаешь весь стринглист, то можно сразу задать нужное количество строк (n - сколько строк в начале грида должно остаться без изменения):
Код: StringGrid.RowCount := StringList.Count + n;
for i := 0 to StringList.Count - 1 do begin
StringGrid.Cells[0, i + n] := IntToStr(i + 1);
StringGrid.Cells[1, i + n] := StringList[i];
...
end;
Автор: zvyagaaa
Дата сообщения: 09.06.2007 16:41
Здравствуйте, есть база данных в xml, каким образом ее можно подключить к DataSource? Есть ли стандартные компоненты для работы с xml? Дельфи 2006.
Автор: andead
Дата сообщения: 09.06.2007 17:06
zvyagaaa
ClientDataSet может из xml данные брать
Автор: Telmton
Дата сообщения: 09.06.2007 22:00
У меня вопрос. Заранее извиняюсь если не туда.

Касается синтаксиса программы и использования uses.

Есть Unit1 (Form1). У него в разделе interface описывается тип TP1.
Еще есть Unit2 (Form2), в разделе interface которого описывается тип ТР2, использующий тип ТР1 (допустим для примера: ТР1=record a: Double; end;, TP2=record h:TP1 end;).
Для того чтобы использовать в описании типа ТР2 тип ТР1 нужно в разделе interface модуля Unit2 вставить строку "uses Unit1".
Еще в модуле Unit2 описывается тип ТР3.

Далее ситуация обстоит следующим образом. В модуле Unit1 нужно создать процедуру, использующую в качестве параметра тип ТР3. Создаю, нажимаю Ctrl+C и её объявление заносится в список процедур класса формы Form1. Таким образом, оно (объявление) оказывается в части interface модуля Unit1. Чтобы использовать этот тип, надо в разделе interface модуля Unit1 написать "Uses Unit2". Написал.
При нажатии на F9, программа, что естественно, выдает ошибку что-то вроде "circular uses" (точный текст не помню).

Вопрос такой: можно ли использовать тип ТР3 в модуле Unit1 без ограничений и при этом не перемещать его в Unit1, а оставить в Unit2 ?
Чую что нельзя, т.к. прочитал Хэлп. Но надежда еще есть, т.к. надеюсь что прочитал не всё.
Автор: OdesitVadim
Дата сообщения: 09.06.2007 22:21
Такие проблемы называются ошибкой дизайна. Решаются очень просто. Создаётся ещё один юнит, куда выносятся все определения. Потом этот юнит подключается к обоим(первым двум) юнитам.
Автор: Sampron
Дата сообщения: 10.06.2007 15:18
Сорри за тупой вопрос просто в делфи не шарю.
Есть исходный Код , установлен Borland Delphi 9 (2005) как скомпилить это всё в исходный файл?
Автор: OOD
Дата сообщения: 13.06.2007 14:23
Проблема такая :
При добавлении записи в БД :


Код:
AdoQuery1.SQl.Text:='INSERT INTO teble (test, fio)VALUES ('#39+Edit2.Text+#39','#39+Edit1.Text+#39');';
Автор: gpi
Дата сообщения: 13.06.2007 15:37
OOD
Попробуй AdoQuery1.Refresh после добавления записи
Автор: Figaro2000
Дата сообщения: 13.06.2007 15:40
OOD
погоди, а с какой стати insert вообще что-то должен отображать в гриде?
Insert - это же вставка в таблицу, а не выборка из нее...
правильный подход -
1. ADODataSet и соответствующий DataSource
2. ADODataSet1.CommandText = 'select * from tablename'
3. Грид со свойством DataSource, указывающим на то, что нарисовал в п.1

4. Судя по твоему коду , редактируешь ты не в самом гриде, а в отдельной форме (там, где у тебя контролы Edit1.Text и Edit2.Text). Посему перед вызовом формы сделай ADODataSet.Append, а после завершения редактирования - ADODataSet.Post
Автор: OOD
Дата сообщения: 13.06.2007 15:49
gpi

Цитата:
Попробуй AdoQuery1.Refresh после добавления записи

Пишет "Обновление невозможно; установлена блокировки"
Автор: gpi
Дата сообщения: 13.06.2007 18:19
OOD
А к какому датасету подключён грид?
Автор: RomanTim
Дата сообщения: 13.06.2007 21:49
OOD
По умолчанию (и не на всех СУБД может по другому) ADO работает с курсором на клиенте, поэтому даже если что-то поменялось в базе Refresh не поможет
Тут 2 варианта:
1. Как написал Figaro2000 делать Append, писать значения в соответствующие поля, затем Post
2. После выполнения AdoQuery1.ExecSQL:
ADODataset.Close; (Table, Query - который отображается на грид)
ADODataset.Open;
ADODataset.Locate(сохраненное значение ключевого поля)
Автор: Figaro2000
Дата сообщения: 13.06.2007 22:56
RomanTim
Ты прав, но твой 2-й вариант хорош после групповых (пакетных, batch) изменений в БД через операторы insert\update\delete. Выполнять же заново запрос после каждого изменения (вставки-удаления-изменения одной записи) накладно по ресурсам. А контролы Edit, упомянутые в вопросе, показывают что скорее всего идет ввод и корректировка по одной записи через форму.
Автор: RomanTim
Дата сообщения: 14.06.2007 07:19
Figaro2000
Бывает, что не всякую операцию вставки можно через Append сделать. Поэтому я и предложил 2 возможных варианта, а какой оптимален для конкретной задачи - пусть OOD сам выбирает - ему потом с юзерами общаться
Автор: Figaro2000
Дата сообщения: 14.06.2007 07:57
RomanTim
о как.. даже интересно... примерчик приведи - чего нельзя через Append сделать?
Автор: RomanTim
Дата сообщения: 14.06.2007 09:53
Figaro2000
Если это простой select * - то да, без проблем, а вот если более-менее сложный запрос, да из нескольких таблиц, да с какими-нибудь вычисляемыми полями... адо такой датасет может просто не позволить редактировать
Автор: Figaro2000
Дата сообщения: 14.06.2007 10:41
RomanTim
Ничего подобного, для того чтоб с такими запросами бороться, есть свойства UniqueTable, ResyncCommand и т.д. В свойствах ADODataset'а указывается таблица, в которую надо вносить изменения и SQL-запрос, который выдаст добавленную или отредактированную запись ... и ву-а-ля... Сам для работы с АДО использую BetterADODataset еще с 2001 года и ни разу не видел ситуации, с которой бы Append не справился. Разумеется, речь идет про одиночные изменения через грид или форму. Пакетные (групповые) изменения - отдельный разговор.
Автор: RomanTim
Дата сообщения: 14.06.2007 10:57
Figaro2000
Никто и не говорит про пакетные изменения.
Если ты с какой-то проблемой не сталкивался - это еще отнюдь не гарантия того, что ее в природе не бывает.
Я дал человеку 2 варианта, что использовать ему виднее, флуд давай заканчивать.
Автор: Figaro2000
Дата сообщения: 14.06.2007 12:18
RomanTim
а я-то всего пример конкретный хотел получить
Автор: Sampron
Дата сообщения: 14.06.2007 13:05
Никто незнает почему в последних версиях Делфи скомпиленый файл на выходе имеет размер почти в два раза больше чем в старых версиях Делфи?
Автор: RomanTim
Дата сообщения: 14.06.2007 13:49
Figaro2000
Помню что не получалось через Append, а конкретный пример... некогда рыться в своих и уже не свих проектах.

Sampron
VCL потихонечку пухнет, обрастает новыми модулями, классами и функциями
Автор: Sampron
Дата сообщения: 14.06.2007 15:53
RomanTim

Цитата:
VCL потихонечку пухнет, обрастает новыми модулями, классами и функциями

Понял Спасибо!
Подскажите как можно сделать форму подвижной при значении BorderStyle bsNone ?
Автор: gpi
Дата сообщения: 14.06.2007 16:49
Sampron
Советы по Delphi от Валентина Озерова:

Код: procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform ( WM_SYSCOMMAND, SC_MOVE+2, 0 );
end;
Автор: RomanTim
Дата сообщения: 14.06.2007 21:15
Sampron
Можно еще добавить обработчик сообщения WM_NCHITTEST:
Код:
TForm1 = class(TForm)
private
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
...
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
if (например определение области, за которую можно двигать) then
Msg.Result := HTCAPTION
else
inherited;
end;
Автор: Sampron
Дата сообщения: 15.06.2007 11:23
gpi
RomanTim
Спасибо за помощь! но чёто немогу эти коды интегрировать в inno setup на wizardform.
Автор: GreatOne
Дата сообщения: 15.06.2007 12:09
Кто-нить знает как можно заставить StringGrid переносить текст непомещающийся горизонтально в ячейке на другую строку???
Автор: RomanTim
Дата сообщения: 15.06.2007 13:14
Sampron
Это наверное лучше уже спрашивать в конференции по InnoSetup

GreatOne
Что ты понимаешь под "другой строкой"? Следующая стока в гриде (т.е. Cells[Col, Row+1]) или многострочный тект в рамках ячейки?
Автор: GreatOne
Дата сообщения: 15.06.2007 13:16
RomanTim

Я имею ввиду следующую строку в ячейке.
Автор: Sampron
Дата сообщения: 15.06.2007 13:28
RomanTim
Там уже спрашивал но никто не смог помочь потому обратился сюда, вдруг кто-то юзает инно и сможет помочь.
Автор: Mandor Sawall
Дата сообщения: 15.06.2007 16:03
GreatOne
В общем, надо нарисовать "ручками" (на OnDrawCell) или използувать какой-то заместитель TStringGrid-а, которой поддерживает многострочной текст.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: 1С: Конвертация данных 2.0


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.