Форум: "Начинающим";
Текущий архив: 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