![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Индексация типов данных [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?
Вот структура или объект - дело другое, но массив...
Можно сделать тип массива некий родительский класс, а
элементы массива создавать как наследники данного класса.