|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
String как имя объекта и ...
Среда разработки: CodeGear, delphi 2010, Windows 7
Исходничек: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,DB, StdCtrls, OleCtnrs, DBClient; type TForm1 = class(TForm) ClientDataSet1: TClientDataSet; ClientDataSet1id: TIntegerField; ClientDataSet1LastName: TStringField; ClientDataSet1Name: TStringField; ClientDataSet1Patronymic: TStringField; ClientDataSet1Post: TStringField; ClientDataSet1Salary: TFloatField; DataSource1: TDataSource; ClientDataSet2: TClientDataSet; ClientDataSet2id: TIntegerField; ClientDataSet2Processor: TStringField; ClientDataSet2Cores: TIntegerField; ClientDataSet2Memory: TFloatField; DataSource3: TDataSource; Label1: TLabel; ListBox2: TListBox; OleContainer1: TOleContainer; ListBox1: TListBox; OpenDialog1: TOpenDialog; Button2: TButton; procedure ListBox2Enter(Sender: TObject); procedure CreateDataSourceList(lParent: TComponent); private { Private declarations } public { Public declarations } end; type DataSourceData = record Tag: LongInt; FieldsCount: integer; FieldDisplayLabels: array [0..500] of string[70]; IsVisible: array [0..500] of boolean; end; var dsRecord: array [0..99] of DataSourceData; DataSourceCount: integer; DataSourceNames: array[0..99] of string; Form1: TForm1; implementation {$R *.dfm} procedure Tform1.CreateDataSourceList(lParent: TComponent); var DS: TDataSource; i,j,k:integer; lIndex:integer; sstring:string; begin Listbox2.clear; DataSourceCount:=0; for k := 0 to lParent.ComponentCount - 1 do if lParent.Components[k] is TDataSource then begin DataSourceNames[DataSourceCount]:={lParent.Name+'.'+}lParent.components[k].name; inc(DataSourceCount); ListBox2.Items.Add(lparent.Components[k].name); end; if (ListBox2.Items.Count=0) or (DataSourceCount=0) then exit; for I := 0 to ListBox2.Items.Count - 1 do begin DS := TDataSource(DataSourceNames[i]); k:=i; sstring:=DataSourceNames[i]+' '+inttostr(i); if Assigned(DS) then k:=i else continue; dsRecord[i].Tag:=DS.Tag; dsRecord[i].FieldsCount:=0; for j := 0 to DS.DataSet.Fields.Count-1 do begin dsRecord[i].FieldDisplayLabels[dsRecord[i].FieldsCount]:=DS.DataSet.Fields.Fields[j].DisplayLabel; inc(dsRecord[i].FieldsCount); dsRecord[i].IsVisible[j]:=false; end; end; end; procedure TForm1.ListBox2Enter(Sender: TObject); begin CreateDataSourceList(form1); end; end. Описание проблемы: В итоге на форме имеем 2 DataSource с именами DataSource1 и DataSource3. Вот в этом месте: Код:
for I := 0 to ListBox2.Items.Count - 1 do begin DS := TDataSource(DataSourceNames[i]); Код:
for j := 0 to DS.DataSet.Fields.Count-1 do begin dsRecord[i].FieldDisplayLabels[dsRecord[i].FieldsCount]:=DS.DataSet.Fields.Fields[j].DisplayLabel; на этой же, первой итерации записываются дисплейлабелы ВТОРОГО DataSource, то есть DataSource3. А на второй итерации при выборе DataSource3 на строчке Код:
for j := 0 to DS.DataSet.Fields.Count-1 do Подскажите в чем дело? Я как то не правильно присваиваю переменной DS конкретный DataSource? |
#2
|
||||
|
||||
Цитата:
Цитата:
|
#3
|
|||
|
|||
Я такой способ обращения где то нагуглил...
Ну первый DataSource же увидел таким способом... |
#4
|
|||
|
|||
А можно ли как-нибудь обратиться к объекту используя его имя как строку? Или может есть какой-то другой Идентификатор объекта на форме, фрейме?
Вообще такой способ нужен для того как раз, что бы из фрейма считать список DataSource на форме, на которой лежит этот самый фрейм и забить его в ListBox. |
#5
|
||||
|
||||
ComponentByName наверное.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#6
|
||||
|
||||
Код:
function FindComponent(const AName: string): TComponent; Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
одинадцатый (22.10.2012)
|
#7
|
|||
|
|||
Сделал так:
Код:
DS := FindComponent(DataSourceNames[i]) as TDataSource; Но конечная цель не достигнута. Дело в том что если так искать компонент с формы, на которой ищем компонент то всё функционирует нормально, а если этим методом искать из фрейма то, по всей видимости, он ищет на самом фрейме, а не на форме, на которой лежит фрейм. Как быть? |
#8
|
||||
|
||||
Так а ты у кого этот метод то вызываешь?
Вызовешь у фрейма, будет искать на фрейме, на форме - на форме. И еще, проверку на nil добавь, а то AV 00000000 получишь. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
одинадцатый (22.10.2012)
|
#9
|
|||
|
|||
А разве строка
Код:
if Assigned(DS) then k:=i else continue; Дак с формы не хотелось бы вызывать( Надо сделать фрейм как можно более... автономным что ли. То есть что бы в юнит, на которую он натянут пришлось добавлять как можно меньше кода. |
#10
|
||||
|
||||
Цитата:
Я на эту смотрел, верхние посты по диагонали читал Код:
DS := FindComponent(DataSourceNames[i]) as TDataSource; Я бы ссылки на датасеты сложил бы в ObjectList (а лучше в TStrings, он как ассоциативный может работать), оттуда брал бы их, чтоб не изгаляться — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
одинадцатый (22.10.2012)
|
#11
|
||||
|
||||
Цитата:
Цитата:
GetParentForm найдёт форму на которой располагается фрейм. |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
одинадцатый (22.10.2012)
|
#12
|
|||
|
|||
Большое спасибище!
Сделал в итоге как-то так: Код:
DS := GetParentForm(self).Components[DataSourceIndexes[i]] as TDataSource; |
#13
|
|||
|
|||
Ой, а подскажите еще: нужно что бы при FormCreate на которой лежит фрейм вызывался метод фрейма. Можно ли это сделать, опять же, не прибегая к добавлению кода в юнит формы?
Сделал через OnEnter фрейма, но это малёха не то. |
#14
|
||||
|
||||
Цитата:
Цитата:
|