Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2012, 15:36   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Создание нескольких компонентов сразу в цикле

Добрый день! Задача проста: в базе данных есть текст в неком поле. Нужно в цикле вытащить этот текст, создать форму, ричэдит для каждого вытащенного значения и вытащенное значение помещать в последний созданный ричэдит. Не получается создать в цикле, ошибка при присвоении имени новой форме (Form):
Код:
procedure TForm1.sSpeedButton14Click(Sender: TObject);
var
 num,bodynote: string;
 Form: TForm;
 SkinProvider: TsSkinProvider;
 RichEdit: TsRichEdit;
 st: TMemoryStream;
 TitleButton: TsTitleButtons;
begin
 Form1.pFIBQuery2.Close;
 Form1.pFIBQuery2.SQL.Clear;
 Form1.pFIBQuery2.SQL.Text:='select * from T_' + l;
 Form1.pFIBQuery2.ExecQuery;
 while not Form1.pFIBQuery2.Eof do
 begin
   bodynote:=Form1.pFIBQuery2.FieldByName('BODYNOTE').AsString;

   Form1.pFIBQuery3.Close;
   Form1.pFIBQuery3.SQL.Clear;
   Form1.pFIBQuery3.SQL.Text:='select count(*) as A from T_' + l;
   Form1.pFIBQuery3.ExecQuery;
   num:='№' + IntToStr(Form1.pFIBQuery3.FieldByName('A').AsInteger - 1);


//создаю форму динамически
   Form:=TForm.Create(Self);
   Form.BorderIcons:=[biSystemMenu];
   Form.Caption:=' ';
//   Form.Name:='Form' + IntToStr(Form1.pFIBQuery3.FieldByName('A').AsInteger + 1);
   Form.BorderStyle:=bsSizeable;

 //создаю компонент TsSkinProvider
   SkinProvider:=TsSkinProvider.Create(Form);
   SkinProvider.CaptionAlignment:=taLeftJustify;
   SkinProvider.ShowAppIcon:=False;
   SkinProvider.AddedTitle.Font.Size:=8;
   SkinProvider.AddedTitle.Font.Style:=[fsBold];
   SkinProvider.AddedTitle.Text:=num;

 //создаю кнопку

   //создаю компонент TsRichEdit
   RichEdit:=TsRichEdit.Create(Form);
   RichEdit.Parent:=Form;
   RichEdit.Align:=alClient;
   RichEdit.Lines.Add(bodynote);
   RichEdit.Font.Name:='Monotype Corsiva';
   RichEdit.Font.Size:=12;
   RichEdit.SkinData.CustomColor:=True;
   RichEdit.SkinData.CustomFont:=True;
   RichEdit.Color:=clWhite;

   st.Free;

   FOrm1.pFIBQuery2.Next;
 end;

 Form.Show;
end;
Прошу помочь советами.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 05.06.2012, 15:45   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
'select count(*) as A from T_' + l;
...
Form.Name:='Form' + IntToStr(Form1.pFIBQuery3.FieldByName('A').AsInteger + 1)
если число записей в двух или более таблицах будет одинаковое, будут создаваться формы с одинаковыми именами. Тем более l и не меняется в цикле. Зачем каждый раз перезапускать pFIBQuery3 с одинаковым SQL?

Зачем вобще использовать значение поля в имени? Создайте дополнительное поле у класса формы и увеличивайте его для каждой новой формы.

Код:
Inc(fFormNum);
Form.Name:='Form' + IntToStr(fFormNum);

Код:
Form:=TForm.Create(Self);
если owner будет nil, имхо, имя и не нужно
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 05.06.2012 в 15:52.
veniside вне форума Ответить с цитированием
Старый 05.06.2012, 16:03   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А зачем вообще имя формы нужно? Разве что при поиске по Component.Name.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.06.2012, 16:05   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
если owner будет nil, имхо, имя и не нужно
Цитата:
А зачем вообще имя формы нужно?
Мне нужно будет потом по нажатию на крестик удалять форму как-то. Как? Я заранее не знаю какая будет выбрана.
Цитата:
если число записей в двух или более таблицах будет одинаковое, будут создаваться формы с одинаковыми именами.
Не понял смысла предложения.
Цитата:
Тем более l и не меняется в цикле. Зачем каждый раз перезапускать pFIBQuery3 с одинаковым SQL?
Имеешь ввиду T_? Это имя таблицы вообще.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 05.06.2012, 16:08   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Мне нужно будет потом по нажатию на крестик удалять форму как-то
OnClose в форме и caFree не катит?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.06.2012, 16:11   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вот, сделал так (вроде работает):
Код:
procedure TForm1.sSpeedButton14Click(Sender: TObject);
var
 num,bodynote: string;
 Form: TForm;
 SkinProvider: TsSkinProvider;
 RichEdit: TsRichEdit;
 st: TMemoryStream;
 TitleButton: TsTitleButtons;
 fFormName: integer;
begin
 fFormName:=0;
 Form1.pFIBQuery2.Close;
 Form1.pFIBQuery2.SQL.Clear;
 Form1.pFIBQuery2.SQL.Text:='select * from T_' + l;
 Form1.pFIBQuery2.ExecQuery;
 while not Form1.pFIBQuery2.Eof do
 begin
   bodynote:=Form1.pFIBQuery2.FieldByName('BODYNOTE').AsString;

//создаю форму динамически
   Form:=TForm.Create(Self);
   Form.BorderIcons:=[biSystemMenu];
   Form.Caption:=' ';
   Inc(fFormName);
   Form.Name:='Form' + IntToStr(fFormName);
   Form.BorderStyle:=bsSizeable;

 //создаю компонент TsSkinProvider
   SkinProvider:=TsSkinProvider.Create(Form);
   SkinProvider.CaptionAlignment:=taLeftJustify;
   SkinProvider.ShowAppIcon:=False;
   SkinProvider.AddedTitle.Font.Size:=8;
   SkinProvider.AddedTitle.Font.Style:=[fsBold];
   SkinProvider.AddedTitle.Text:=num;

 //создаю кнопку

   //создаю компонент TsRichEdit
   RichEdit:=TsRichEdit.Create(Form);
   RichEdit.Parent:=Form;
   RichEdit.Align:=alClient;
   RichEdit.Lines.Add(bodynote);
   RichEdit.Font.Name:='Monotype Corsiva';
   RichEdit.Font.Size:=12;
   RichEdit.SkinData.CustomColor:=True;
   RichEdit.SkinData.CustomFont:=True;
   RichEdit.Color:=clWhite;

   st.Free;

   Form1.pFIBQuery2.Next;
   Form.Show;
 end;
end;
Теперь вопрос-момент:
1. Как при создании формы расположить их рядом друг с другом на рабочем столе? Ну, например, чтобы расстояние между созданными формами было где-то полсантиметра или сантиметр.
Цитата:
OnClose в форме и caFree не катит?
Как это? Назначить один обработчик всем?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 05.06.2012 в 16:18.
artemavd вне форума Ответить с цитированием
Старый 05.06.2012, 16:13   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Как это? Назначить один обработчик всем?
Почему бы и нет? Разместить в главной форме, в нем просто Action:=caFree. Удалит форму, которая обратиласть.
Цитата:
Как при создании формы расположить их рядом друг с другом
Left,Top, и Position=poDesigned
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.06.2012 в 16:15.
Аватар вне форума Ответить с цитированием
Старый 05.06.2012, 16:27   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вот, наваял так создание формы:
Код:
//создаю форму динамически
   Form:=TForm.Create(Self);
   Form.BorderIcons:=[biSystemMenu];
   Form.Caption:=' ';
   Form.Height:=220;
   Form.Width:=200;
   Form.Position:=poDesigned;
   Form.Top:=0;
   Form.Left:=0;
   Inc(fFormName);
   Form.Name:='Form' + IntToStr(fFormName);
   Form.Caption:='№' + IntToStr(fFormName);
   Form.Icon.Empty;
   Form.BorderStyle:=bsSizeable;
но, естественно, что они все располагаются в левом верхнем углу формы. А мне надо, чтобы они следовали от левого верхнего угла рабочего стола, по горизонтали, друг за другом и между ними был промежуток 1 см. А если следующая созданная форма, достигла правого края рабочего стола, то она бы помещалась во второй ряд и т.д. для остальных. Вот, это не знаю как сделать.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 05.06.2012, 16:34   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Заведи начальные значения для Left и Top. При создании формы давай приращение. Один см тяжелее, для разных разрешений разное к-во пикселей. Вычислить можно, но не уверен, что для всех возможных конфигураций мониторов. Можно просто давать приращение, ну 20 пикселей например. Или 1см обязательно? Размеры экрана в пикселях в Screen.Width и Screen.Height
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.06.2012 в 16:42.
Аватар вне форума Ответить с цитированием
Старый 05.06.2012, 17:20   #10
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А как именно правильно записать приращение? Помоги немного кодом если не сложно.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очистка сразу нескольких StringGrid Artamos Компоненты Delphi 7 13.05.2011 13:58
Установка нескольких атрибутов сразу Shouldercannon Общие вопросы Delphi 7 01.05.2011 22:49
обращение к именам компонентов в цикле JK0 Помощь студентам 7 23.09.2010 14:10
заполнение сразу нескольких однотипных значений Domanoff БД в Delphi 2 22.04.2010 13:37
Создание сразу нескольких txt файлов Nice42ru Помощь студентам 11 11.02.2010 18:35