Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Индексация типов данных [WinXP]


Infloop ©   (2007-07-05 01:12:00) 

Доброго времени суток.
Возможно ли средствами Delphi и если возможно то как сделать такой код:

У меня есть несколько типов данных, допустим MyType1, MyType2,...., MyTypeN. Все они различны.

Как осуществить индексированный доступ к ним? То есть создать  одномерный массив в котором каждый элемент имел бы различный тип.


Ega23   (2007-07-18 09:42:00) [1]


> Ega23, давай-ка ты сам книжки почитаешь, "дружок". :)


Смею тебя уверить, что я их читал. И хелп читаю до сих пор.


> Даже если он чё-то не то делает, хотя лично у меня его код
> компилируется нормально, я сюда с поисковика пришёл и увидел
> только совет книжки читать. А можно я сайты читать буду
> а не книжки? Можно? Спасибо!


Можно Машку за ляжку
Или Мишку за шишку.


New(PF_Customs_View);
GetMem(Frames[Count],SizeOf(TF_Customs_View));
Dispose(PF_Materials_View);


С учётом того, что TF_Customs_View суть класс, то совет книжки почитать - не лишний.


Ян   (2007-07-17 23:56:00) [2]

Ega23, давай-ка ты сам книжки почитаешь, "дружок". :)

А то что-то я не понимаю, чего у тебя за претензии на счёт книжек.

Даже если он чё-то не то делает, хотя лично у меня его код компилируется нормально, я сюда с поисковика пришёл и увидел только совет книжки читать. А можно я сайты читать буду а не книжки? Можно? Спасибо!

2Infloop:
На счёт твоего исходника - вроде бы всё правильно. У меня такой код компилируется. И такой (мой исходник, рабочий и используемый с этого дня):

type
 TimageClass=class of TGraphic;
 TclassRecord=
   record
    imageClass:TimageClass;
    extList:string;
   end;
var
 classTable:array of TclassRecord;
procedure addImageClass(AimageClass:TimageClass;AextList:string);
 begin
  AextList:=UpperCase(AextList);
  if AextList<>''
   then
    AextList:=';'+AextList+';';
  setLength(classTable,length(classTable)+1);
  with classTable[high(classTable)] do
   begin
    imageClass:=AimageClass;
    extList:=AextList;
   end;
 end;
    function loadGraphic(ext,fn:string):TGraphic;
     var
      i:integer;
     begin
      result:=nil;
      for i:=low(classTable) to high(classTable) do
       if pos(ext,classTable[i].extList)<>0
        then
         begin
          result:=classTable[i].imageClass.Create;
          try
          result.LoadFromFile(fn);
          except
           FreeAndNil(result);
          end;
          exit;
         end;
     end;

initialization
  addImageClass(TGIFGraphic,'gif');
  addImageClass(TJPEGImage,'jpg;jpeg');
  addImageClass(TPNGGraphic,'png');
  addImageClass(TBitmap,'bmp');
  addImageClass(TIcon,'ico');
end.


P.S. Судя по сообщению об ошибке, слева от знака присваивания у тебя написано именно T_Frame, а не TFrame, как написано в приведённом тобой фрагменте.

Если уж совсем труба не разобраться, закомментируй все ошибочные строки, напиши вместо них "Frame_Type[FType].Create(MainForm);"  и если скомпилируется, нажми Ctrl и кликни на Create, потом на TFrame рядом с Temp_View и посмотри, не к разным ли типам они ведут. Может идентификатор где-то повторяется.


Infloop   (2007-07-05 21:27:00) [3]

Книгу посоветуешь?


icWasya   (2007-07-05 20:34:00) [4]

>Infloop   (05.07.07 15:34) [12]
Что значит
>Дело в том что


Ega23   (2007-07-05 15:42:00) [5]


> Причем
> type
> T_Frame = class of TFrame;
> var
> Frame_Type: array [0..255] of T_Frame;
>


у-у-у-у как всё запушено....
Давай-ка, дружок, начни с прочтения книг.


Infloop   (2007-07-05 15:39:00) [6]

Причем
type
T_Frame = class of TFrame;
var
Frame_Type: array [0..255] of T_Frame;


Infloop   (2007-07-05 15:34:00) [7]

Дело в том что

function TFrameManager.CreateFrame(FType:Integer):Integer;
var
Temp_View:TFrame;
begin
Temp_View:=Frame_Type[FType].Create(MainForm);   << Строка 183
Temp_View.Parent:=MainForm;
Temp_View.Left:=0;
Temp_View.Top:=29;
Temp_View.Name:='InterFrame'+IntToStr(Count);
Temp_View.Align:=alClient;
// остальные специфические действия делать в OnFrameCreate
Frames[Count]:=Temp_View;
Result:=Count;
Inc(Count);
end;

[Error] AM_DB_PAS01.pas(183): Incompatible types: 'T_Frame' and 'TFrame'
[Error] AM_DB_PAS01.pas(184): Property 'Parent' inaccessible here
[Error] AM_DB_PAS01.pas(185): Property 'Left' inaccessible here
[Error] AM_DB_PAS01.pas(186): Property 'Top' inaccessible here
[Error] AM_DB_PAS01.pas(187): Property 'Name' inaccessible here
[Error] AM_DB_PAS01.pas(188): Property 'Align' inaccessible here


Ega23   (2007-07-05 15:21:00) [8]


>  PF_Customs_View:^TF_Customs_View;         // Указатель
> на фрейм с заказами
>    PF_Materials_View:^TF_Materials_View;     // Указатель
> на фрейм с материалами


Это ужасно.
var
btn : TButton


btn в данном случае - уже указатель на объект (экземпляр класса TButton)


Infloop   (2007-07-05 15:17:00) [9]

Спасибо счас попробую.


icWasya   (2007-07-05 14:20:00) [10]

Во первых, что по Вашему должны делать эта строки?

 New(PF_Customs_View);
 GetMem(Frames[Count],SizeOf(TF_Customs_View));
 Dispose(PF_Materials_View);

С объектами так не делают.
Выкинуть нафиг.

Примерно так
1)

type
 T_Frame = class of TFrame;
var
 Frame_Type: array [0..255] of TFrame;

2)
где-нибудь один раз заполнить этот массив

Frame_Type[0] := TF_Customs_View;
Frame_Type[1] := TF_Materials_View;
...
Frame_Type[255] := TF_End_View;


3)

function TFrameManager.CreateFrame(FType:Integer):Integer;
var
 Temp_View:TFrame;
begin
Temp_View:=Frame_Type[FType].Create(MainForm);
Temp_View.Parent:=MainForm;
Temp_View.Left:=0;
Temp_View.Top:=29;
Temp_View.Name:='InterFrame'+IntToStr(Count);
Temp_View.Align:=alClient;
// остальные специфические действия делать в OnFrameCreate
Frames[Count]:=Temp_View;
Result:=Count;
Inc(Count);
end;

procedure TFrameManager.CloseFrame(Index:Integer);      
begin
 if Index >= Count then exit;
 Frames[Index].Free;
 Frames[Index]:=Nil;
end;

procedure TFrameManager.CloseAllFrames;      
var
 I:Integer;
begin
 for I:= 0 to Count-1 do begin
   Frames[I].Free;
   Frames[I]:=Nil;
end;
Count:=0;
end;


Сергей М.   (2007-07-05 13:52:00) [11]


> поскольку в каждом фрейме есть элементы (TButtons, TDBGrids
> и тд.) то естественно названы они по разному: TF_Customs_View,
>  TF_Materials_View


Что-то я не понял истинной глубины этой причинно-следственной связи)

Ну да шут с ней.

И что ты хочешь видеть применительно к этому коду ?


Джо   (2007-07-05 13:50:00) [12]

TObjectList.


Infloop   (2007-07-05 13:45:00) [13]

Создаю я фреймы так:

procedure TFrameManager.CreateFrame(FType:Integer);
begin
Case FType of
1:        //Фрейм "Список заказов"
begin
 New(PF_Customs_View);
 GetMem(Frames[Count],SizeOf(TF_Customs_View));
 PF_Customs_View^:=TF_Customs_View.Create(MainForm);
 PF_Customs_View^.Parent:=MainForm;
 PF_Customs_View^.Left:=0;
 PF_Customs_View^.Top:=29;
 PF_Customs_View^.Name:='InterFrame'+IntToStr(Count);
 PF_Customs_View^.Align:=alClient;
 Frames[Count]:=PF_Customs_View;
 Dispose(PF_Customs_View);
end;
2:         //Фрейм "Список материалов"
begin
 New(PF_Materials_View);
 GetMem(Frames[Count],SizeOf(TF_Materials_View));
 PF_Materials_View^:=TF_Materials_View.Create(MainForm);
 PF_Materials_View^.Parent:=MainForm;
 PF_Materials_View^.Left:=0;
 PF_Materials_View^.Top:=29;
 PF_Materials_View^.Name:='InterFrame'+IntToStr(Count);
 PF_Materials_View^.Align:=alClient;
 Frames[Count]:=PF_Materials_View;
 Dispose(PF_Materials_View);
end;
end;
Frame_Type[Count]:=FType;
Active_Frame:=Count;
Count:=Count+1;
end;


Infloop   (2007-07-05 13:44:00) [14]

Причина такого вопроса такова: Есть много созданных разных Фреймов TFrame.  Но поскольку в каждом фрейме есть элементы (TButtons, TDBGrids и тд.) то естественно названы они по разному: TF_Customs_View, TF_Materials_View.

Вставляю на форму я их программно:
Вот код:

TFrameManager = class(TObject)
   Count:Integer;                            // Кол-во фреймов (до 255)
   Active_Frame:Integer;                     // Активный фрейм
   Frame_Type:array[0..255] of Integer;      // Тип Фрейма
   Frames:array[0..255] of Pointer;          // Фреймы
   //Типы фреймов по порядку:
   PF_Customs_View:^TF_Customs_View;         // Указатель на фрейм с заказами
   PF_Materials_View:^TF_Materials_View;     // Указатель на фрейм с материалами
   //
   procedure CreateFrame(FType:Integer);     // Вставка фрейма
   procedure CloseFrame(Index:Integer);      // Удаение фрейма
   procedure SetActiveFrame(Index:Integer);  //
 end;


kilya   (2007-07-05 09:25:00) [15]

можно сделать массив различных классов, если у них общий абстрактный родитель


Сергей М.   (2007-07-05 09:10:00) [16]


> Как осуществить индексированный доступ к ним?


Приведи пример объявленияфункции, которая бы делала то что тебе требуется..


Джо   (2007-07-05 03:18:00) [17]

> [0] Infloop   (05.07.07 01:12)
> Доброго времени суток.
> Возможно ли средствами Delphi и если возможно то как сделать
> такой код:
>
> У меня есть несколько типов данных, допустим MyType1, MyType2,
> ...., MyTypeN. Все они различны.
>
> Как осуществить индексированный доступ к ним? То есть создать
> одномерный массив в котором каждый элемент имел бы различный
> тип.

array of Pointer или, скажем, TList.
И приведение типов.
Вообще, все зависит от типов этих типов, извини за тавтологию. Хорошо бы полнее раскрыть тему.


Kostafey   (2007-07-05 02:18:00) [18]

По-моему никак.
Во всяком случае для одномерного массива.
Или я ничего не понимаю в Pascal?

Вот структура или объект - дело другое, но массив...

Можно сделать тип массива некий родительский класс, а
элементы массива создавать как наследники данного класса.


Наверх

Титульная страница Поиск, карта сайта Написать письмо