Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

Индексация типов данных   Найти похожие ветки 

 
Infloop   (2007-07-05 01:12) [0]

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

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

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


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

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

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

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


 
Джо ©   (2007-07-05 03:18) [2]

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

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


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


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


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


 
kilya ©   (2007-07-05 09:25) [4]

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


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

Причина такого вопроса такова: Есть много созданных разных Фреймов 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;


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

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

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;


 
Джо ©   (2007-07-05 13:50) [7]

TObjectList.


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


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


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

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

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


 
icWasya ©   (2007-07-05 14:20) [9]

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

 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;


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

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


 
Ega23 ©   (2007-07-05 15:21) [11]


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


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


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


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

Дело в том что

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


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

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


 
Ega23 ©   (2007-07-05 15:42) [14]


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


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


 
icWasya ©   (2007-07-05 20:34) [15]

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


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

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


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

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 и посмотри, не к разным ли типам они ведут. Может идентификатор где-то повторяется.


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


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


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


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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2007.08.12;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.029 c
1-1181105710
DelphiN!
2007-06-06 08:55
2007.08.12
Подключиться к HKEY_CURRENT_USER другого пользователя


2-1184592686
avp
2007-07-16 17:31
2007.08.12
Чем отличаются фундаментальные типы данных от общих?


15-1184588198
Darvin
2007-07-16 16:16
2007.08.12
Сообщение Windows с кодом $B03F


2-1184237695
deras
2007-07-12 14:54
2007.08.12
Как сгенерить случайное число целого типа...


2-1184816137
zsergey
2007-07-19 07:35
2007.08.12
связка двух таблиц ...