|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как получить доступ к динамически созданным объектам?
Доброго времени суток. Делаю следующее.
На форме есть PageControl с нулевым количеством вкладок. При нажатии на кнопку в нем создается вкладка, содержащая два Memo. При нажатии еще раз - еще одна вкладка с двумя Memo (как в QIP). Как получить доступ к этим Memo? Т.е. нужно получить текст компонента TMemo (например, Memo2.Text) который был динамически создан на динамически созданной вкладке в PageControl :-) Задача несложная, просто никак не соображу как это сделать. Вот код: Код:
procedure TForm2.AddPage(PageCap: string); var TSh: TTabSheet; begin begin TSh := TTabSheet.Create(Self); TSh.Caption := PageCap; TSh.Parent := Self; TSh.PageControl := PageControl1; PageControl1.ActivePage := TSh; Memo1 := TMemo.Create(Self); Memo2 := TMemo.Create(Self); Memo1.Parent := TSh; Memo2.Parent := TSh; end; |
#2
|
|||
|
|||
Используй TList
тут краткое описание |
#3
|
||||
|
||||
Т.к. переменная TSh у тебя локальная, то при окончании работы процедуры ссылка на нее теряется и доступа к ней ты получить не можешь. Но не будем унывать Вкладки ты создаешь так:
Код:
TSh := TTabSheet.Create(Self); Код:
for i:=0 to ComponentCount-1 do if Components[i] is TTabSheet then <сюда попадет только в том случае если компонент формы будет являться экземпляром класса TTabSheet либо его наследником> Код:
(Components[5] as TTabSheet).<имя свойства или метода> ЗЫЖ Для Memo - аналогично Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#4
|
|||
|
|||
Aristarh Dark, следуя твоему совету, должно работать следующее:
Код:
procedure TfrmPrivMsg.acPrivSendExecute(Sender: TObject); var I: integer; begin for I := 0 to PageControl1.ActivePage.ComponentCount - 1 do Memo1.Lines.Add(PageControl1.ActivePage.Components[i].Name); end; |
#5
|
|||
|
|||
Что то я не пойму. Почти аналогично создаю TTabSheet:
Код:
var MainForm: TMainForm; Tab : TTabSheet; REdit: TRichEdit; procedure TMainForm.ToolButton1Click(Sender: TObject); begin Tab := TTabSheet.Create(PageControl1); Tab.Visible := true; Tab.Caption := 'Без имени.txt'; Tab.PageControl := PageControl1; Tab.Hint := ''; Tab.ShowHint := True; Tab.PopupMenu := EmptyPopupMenu; PageControl1.ActivePageIndex := Tab.TabIndex; REdit := TRichEdit.Create(Tab); REdit.Parent:= Tab; REdit.Align := alClient; REdit.PopupMenu := EditPopupMenu; Redit.Lines.Clear; REdit.Visible := True; REdit.SetFocus; end; И затем пытаюсь найти активный TTabSheet: Код:
procedure TMainForm.ToolButton3Click(Sender: TObject); var i : Integer; begin if(SaveDialog1.Execute) then begin for i:=0 to ComponentCount-1 do if Components[i] is TTabSheet then begin if (Components[i] as TTabSheet).PageIndex = PageControl1.ActivePageIndex then begin ShowMessage('qwe'); end; end; end; end; Сколько бы не создавал TTabSheet, ComponentCount у меня всё время равен 31. И ничего не находиться. Любой Components[i] = csInheritable. Что не так? Последний раз редактировалось Rat, 21.10.2008 в 11:24. |
#6
|
|||
|
|||
Всё. Понял. Сделал так:
Код:
procedure TMainForm.ToolButton3Click(Sender: TObject); var i : Integer; begin SaveDialog1.FileName := PageControl1.Pages[PageControl1.ActivePageIndex].Caption; if(SaveDialog1.Execute) then begin for i:=0 to PageControl1.ActivePage.ComponentCount-1 do if PageControl1.ActivePage.Components[i] is TRichEdit then begin (PageControl1.ActivePage.Components[i] as TRichEdit).Lines.SaveToFile(SaveDialog1.FileName); end; end; end; |
#7
|
|||
|
|||
vinni. В Memo добавляются пустые строки. Т.к. Name = ''.
Можно сделать так: Код:
Memo1.Lines.Add(PageControl1.ActivePage.Components[i].ClassName); |
#8
|
|||
|
|||
Вот именно, что даже пустые не добавляются. И при использовании ClassName тоже ничего не происходит.
Почему имена могут быть пустыми, ведь имя обязательно при создании: Код:
Memo1 := TMemo.Create(Self); Memo2 := TMemo.Create(Self); |
#9
|
||||
|
||||
vinni, извинине, но Вы лопух.
Ясно было сказано: Цитата:
Цитата:
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#10
|
|||
|
|||
Rat, спасибо, сделал как у тебя. Ошибка была в том, что в качестве собственника я указывал Self и присваивал родителя (тоже Self). А нужно было в качестве собственника указать Tab (типа TTabSheet), а родителя не трогать вообще. И потом перебором при нахождении нужного типа берем нужные данные.
|
#11
|
|||
|
|||
Во первых сделай так:
Код:
Memo1 := TMemo.Create(TSh); Memo2 := TMemo.Create(Tsh); Во вторых имя не подставляется. Егу нужно указывать если ты создаешь динамически: Код:
Memo1.Name := 'Name1'; Имя должно быть уникальным. |
#12
|
|||
|
|||
Может кому пригодиться... В общем я бы обращался вот так:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) Button1: TButton; PageControl1: TPageControl; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var TSh: TTabSheet; Memo1, Memo2 : TMemo; begin TSh := TTabSheet.Create(Self); TSh.Caption := 'PageCaption'; TSh.Parent := Self; TSh.PageControl := PageControl1; PageControl1.ActivePage := TSh; Memo1 := TMemo.Create(TSh); Memo2 := TMemo.Create(Tsh); Memo1.Parent := TSh; Memo1.Align:= alTop; Memo1.Height := TSh.Height div 2; Memo2.Parent := TSh; Memo2.Align:= alBottom; Memo2.Height := TSh.Height div 2; end; procedure TForm1.Button2Click(Sender: TObject); var i : Integer; begin for i:=0 to PageControl1.ActivePage.ComponentCount-1 do begin if PageControl1.ActivePage.Components[i] is TMemo then begin if (PageControl1.ActivePage.Components[i] as TMemo).ComponentIndex = 0 then begin (PageControl1.ActivePage.Components[i] as TMemo).Lines.Add('one'); end; end; end; end; procedure TForm1.Button3Click(Sender: TObject); var i : Integer; begin for i:=0 to PageControl1.ActivePage.ComponentCount-1 do begin if PageControl1.ActivePage.Components[i] is TMemo then begin if (PageControl1.ActivePage.Components[i] as TMemo).ComponentIndex = 1 then begin (PageControl1.ActivePage.Components[i] as TMemo).Lines.Add('two'); end; end; end; end; end. На форме должно быть три кнопки и один TPageControl. Цитата:
Последний раз редактировалось Rat, 21.10.2008 в 14:10. |