Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.042 c
2-1184770584
Платоха
2007-07-18 18:56
2007.08.12
защита


2-1184326542
Romikremind
2007-07-13 15:35
2007.08.12
Проблемы с русским языком


2-1184759566
EugeneXP
2007-07-18 15:52
2007.08.12
Создание точного таймера до сотых секунды


3-1177512416
DelphiLexx
2007-04-25 18:46
2007.08.12
Событие перед вводом


2-1184756653
ouchs
2007-07-18 15:04
2007.08.12
uses для функции PostVirtualKeyEvent





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский