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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2012, 10:23   #1
ExpertMQL4
 
Регистрация: 11.08.2012
Сообщений: 7
По умолчанию 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]);
на первой итерации естественно выбирается DataSource1, НО ПОЧЕМУ ТО в массив здесь:
Код:
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
выскакивает ошибка Access violation.

Подскажите в чем дело? Я как то не правильно присваиваю переменной DS конкретный DataSource?
ExpertMQL4 вне форума Ответить с цитированием
Старый 22.10.2012, 10:33   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
DS := TDataSource(DataSourceNames[i]);
О-о-о. Вообще удивительно, что хоть раз отработало. Приведение типа к TDataSource от символьной строки?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.10.2012, 11:41   #3
ExpertMQL4
 
Регистрация: 11.08.2012
Сообщений: 7
По умолчанию

А можно ли как-нибудь обратиться к объекту используя его имя как строку? Или может есть какой-то другой Идентификатор объекта на форме, фрейме?
Вообще такой способ нужен для того как раз, что бы из фрейма считать список DataSource на форме, на которой лежит этот самый фрейм и забить его в ListBox.
ExpertMQL4 вне форума Ответить с цитированием
Старый 22.10.2012, 11:58   #4
ExpertMQL4
 
Регистрация: 11.08.2012
Сообщений: 7
По умолчанию

Сделал так:
Код:
DS := FindComponent(DataSourceNames[i]) as TDataSource;
Но конечная цель не достигнута. Дело в том что если так искать компонент с формы, на которой ищем компонент то всё функционирует нормально, а если этим методом искать из фрейма то, по всей видимости, он ищет на самом фрейме, а не на форме, на которой лежит фрейм.
Как быть?
ExpertMQL4 вне форума Ответить с цитированием
Старый 22.10.2012, 12:42   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
он ищет на самом фрейме, а не на форме, на которой лежит фрейм.
Как быть?
Код:
DS := Form1.FindComponent(....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.10.2012, 12:54   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

GetParentForm
eval вне форума Ответить с цитированием
Старый 22.10.2012, 13:28   #7
ExpertMQL4
 
Регистрация: 11.08.2012
Сообщений: 7
По умолчанию

Большое спасибо за помощь. В итоге сделал как-то так:
Код:
DS := GetParentForm(self).Components[DataSourceIndexes[i]] as TDataSource;
ExpertMQL4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Jquery как из $(this) получить имя объекта? Abuhamed JavaScript, Ajax 2 12.02.2012 03:43
Как получить доступ к процедурам объекта, не указывая его имя? Freddy_Kruger Общие вопросы Delphi 9 23.04.2011 17:12
как изменить имя объекта в программе? Sham1963 Microsoft Office Excel 1 28.05.2010 08:55
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37
Как изменить свойство объекта, если его имя находится в переменной? Aiden Компоненты Delphi 1 13.09.2007 07:57