Создание контролов "на лету"

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Создание контролов "на лету"

Сообщение Troublemaker » 16.04.2008 13:40:38

Пытаюсь писать на FPC/Lazarus.
Решил попробовать такую штуку: в дизайнере на форме рисую одну радиогруппу с четырьмя кнопками. Группу и кнопки делаю невидимыми.
Потом прямо в коде пытаюсь создавать свои группы:

Код: Выделить всё
TForm1 = class(TForm)
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioGroup1: TRadioGroup;
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
        zurray:array[1..10]of ^TRadioGroup;
    { public declarations }
  end;
zurray - мой массив для хранения 10 будущих групп.
В цикле при открытии формы пытаюсь создавать эти группы и ставить их на положенные места:
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
var a:byte;
begin
     for a:=1 to 10 do
     begin
          new(zurray[a]);
          with zurray[a]^ do
          begin
               create(Form1);
               top:=radiogroup1.Top;
               visible:=true;
               left:=radiogroup1.left+radiogroup1.width*(a+1);
          end
     end;
end;
Где-то в районе create(Form1) или top:=... вылетает невразумительный эксепшн.

Так как же правильно создавать новые контролы на форме в реалтайме?

Спасибо. :shock:
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Создание контролов "на лету"

Сообщение sts » 16.04.2008 14:04:57

[quote="Troublemaker"]
Код: Выделить всё
TForm1 = class(TForm)
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioGroup1: TRadioGroup;
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
        zurray:array[1..10]of TRadioGroup;
    { public declarations }
  end;

Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
var a:byte;
begin
     for a:=1 to 10 do
     begin
          zurray[a] := TRadioGroup.create(Form1);
          with zurray[a] do
          begin
               Parent := Form1;
               top:=radiogroup1.Top;
               visible:=true;
               left:=radiogroup1.left+radiogroup1.width*(a+1);
          end
     end;
end;


а так?
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение Troublemaker » 16.04.2008 14:18:35

Обязательно попробую, вот только есть сомнения: .create подразумевает задание parent-a, надо ли его указывать дополнительно в виде .parent:= ?
По логике, заморочек быть не должно, но не лишнее ли это? Или я не учитываю каких-то тонкостей?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение Troublemaker » 16.04.2008 14:57:04

Хм... действительно, без второго parent-a не работало. Хотелось бы знать - почему?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение sts » 16.04.2008 15:12:30

в данном случае - create(Form1); - указывается Owner - владелец созданного компонента - т.е. при удалении Form1 (Free) , она удалит и его , свойство Parent указывает на компонент на котором "лежит" новый компонент.

Например мы имеем форму Form1 : TForm а на ней лежит панель Panel1 : TPanel а на ней лежит RadioGroup1 :TRadioGroup то

Form1.Owner = Application
Form1.Parent = nil
Panel1.Owner = Form1
Panel1.Parent = Form1
RadioGroup1.Owner = Form1
RadioGroup1.Parent = Panel1
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение Troublemaker » 16.04.2008 17:03:28

Спасибо, теперь понятно. Просто я в дельфи не работал, и некоторые догмы мне непонятны. А качество хелпа к Лазарю, как известно, оставляет желать лучшего. Насколько, кстати, актуален хелп от, скажем, дельфи-7, можно ли его использовать при разработке в Лазаре?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение Brainenjii » 16.04.2008 17:10:08

Можно ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Troublemaker » 16.04.2008 18:58:20

Отлично. Теперь осталось выяснить, как при системной локали (ubuntu 8.04, gnome) utf-8 в лазаре-gtk2 использовать те же исходники, что и в виндовом лазаре, то бишь в 1251.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение alexs » 17.04.2008 11:02:13

Пересобрать лазарус под виндой с поддержкой utf8
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Troublemaker » 17.04.2008 17:31:41

Дык, эта, а как? Я не вижу в параметрах сборки желаемой локали. Или я не туда смотрю?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение Brainenjii » 17.04.2008 17:37:36

видимо имеется в виду сборка лазаруса из исходников... Лично я просто переконвертирую iconv'вом все .lfm и .pas из WIN1251 в UTF8 и обратно, если приходится... Быстро и удобно ^_^ Правда с lrs могут проблемы возникать, но легко решаемые...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Troublemaker » 17.04.2008 17:55:40

Я понял, что из исходников. Вроде бы именно она выполняется из соотв. меню в IDE?

А что есть iconv, где его брать, и как лучше поступАть, если на десктопе лазарь виндовый, на буке - из репозиториев убунты, utf-8, gnome, пересобран с gtk2?
Просто пока не могу понять идеологию.

Если под убунтой собираю его с gtk1, то 1251 видит нормально, но писать по-русски не дает.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение alexs » 17.04.2008 18:34:10

В IDE - "Сервис/Параметры сборки Lazarus"
В открывшемся окне - заклазка "Расширенные параметры сборки"
в строке ввода "Параметры" указать ключик:
-dWindowsUnicodeSupport
После этого пересобрать IDE
и не забудь конвертнуть сходники из win1251 в utf8
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Troublemaker » 17.04.2008 18:52:38

Ага, огромное спасибо, alexs, попробую.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение Brainenjii » 17.04.2008 18:55:11

Хм, а если из базы взять строку в UTF-8, как она отобразиться в том же Memo или StringGrid'e?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 3

Рейтинг@Mail.ru