Autor Beitrag
Geri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: So 16.04.06 15:27 
Hallo zusammen

Ich habe mir eine einfache Unit mit Klassen zur Speicherung von diversen Konfigurationsdaten erstellt. Die Basisklasse TFilterConfigData bildet die Basis zum Speichern der Daten. TDxfImportFilterConfigData ist eine konkrete Implementierung von Filterconfigdaten.

TFilterConfigBase bildet schliesslich das Schnittstellenobjekt für den Benutzer(Programmierer): Die Überlegung war, dass TFilterConfigBase eine Standardmethode zum Speichern in ein Stream bereit stellt. Gespeichert werden sollen spezielle Konfigurationsdaten. Leider wird aber beim Aufruf fon FC.saveTofile(..); nicht die Methode TDxfFilterConfigData aufgerufen, sondern die der Basisklasse. Habt ihr vielleich eine gute Idee, wie man dieses Problem elegant lösen könnte?
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
procedure TDxfImport.Button1Click(Sender: TObject);
var FC:TDxfFilterConfigData;
begin
  FC:=TDxfImportFilterConfig.Create();
  FC.SaveToFile('c:\Geri');
end;


unit uFilterConfigBase;
interface
uses classes, sysUtils;

const MaxLayer =100;
      MaxTool = 100;

Type

  TFilterConfigData = class(TObject)
                        Constructor create(); overload;
                        Procedure Store(s:TFileStream); virtual;
                        Procedure Load(s:TFileStream); virtual;
                      End;

  TDxfImportFilterConfigData = Class(TFilterConfigData)
                                      ImportLayerName:Array[0..MaxLayer] of String;
                                      LayerID: Array[0..MaxLayer-1of Integer;
                                      ToolID:Array[0..MaxTool-1of Integer;
                                      Procedure Store(s:TFileStream); overload;
                                      Procedure Load(s:TFileStream); overload;
                                 End;

  TFilterConfigBase = class
                        FilterConfigData:TFilterConfigData;
                        Constructor Create();
                        Function LoadFromFile(name:String):Integer;virtual;
                        Function SaveToFile(name:String):Integer; virtual;
                        function Process:Integer;
                     end;

  TDxfImportFilterConfig = class(TFilterConfigBase)
                             Constructor Create();
                           end;


implementation

Constructor TFilterConfigData.create();
Begin
  inherited create();
End;

Procedure TFilterConfigData.Store(s:TFileStream);
Begin
End;


Procedure TDxfImportFilterConfigData.Load(s:TFileStream);
var  Len:Integer;
     i:Integer;
Begin
  S.Read(Len, SizeOf(Len));
  S.Read(Len, SizeOf(Len));
  S.Read(LayerID,SizeOf(LayerID));
  S.Read(ToolID,SizeOf(ToolID));
  For i:= 0 to MaxLayer-1 Do
  Begin
    S.Read(Len, SizeOf(Len));
    SetLength(ImportLayerName[i], Len);
    S.Read(PChar(ImportLayerName[i])^, Len);
  End;
End;

Procedure TDxfImportFilterConfigData.Store(s:TFileStream);
var len:Integer;
    i:Integer;
Begin
  S.Write(LayerID,SizeOf(LayerID));
  S.Write(ToolID,SizeOf(ToolID));
  for i:=0 to MaxLayer-1 Do
  Begin
    Len := Length(ImportLayerName[i]);
    S.Write(Len, SizeOf(Len));
    S.Write(PChar(ImportLayerName[i])^, Len);
  End;
End;


Constructor TFilterConfigBase.Create();
Begin
   inherited;
End;

Procedure TFilterConfigData.Load(s:TFileStream);
Begin
End;


Constructor TDxfImportFilterConfig.Create();
Begin
  inherited;
  FilterConfigData:=TdxfImportFilterConfigData.create();
End;


function TFilterConfigBase.LoadFromFile(name:String):Integer;
var Stream: TFileStream;
    DataCount:Integer;
Begin
  result:=-1;
  Stream := TFileStream.Create(name, fmOpenRead);
  Stream.Read(DataCount,Sizeof(DataCount));
  if DataCount = 0 then exit;
  try
    FilterConfigData.Load(Stream);
   finally
    Stream.Free;
  end;
end;
// Standardmethde zum Speichern von Filterconfigurationsdaten verschiedenen Typs
function TFilterConfigBase.SaveToFile(name:String):Integer;
var Stream: TFileStream;
    DataCount:Integer;
Begin
  result:=-1;
  DataCount:=12345;  // wird später benötigt
  Stream := TFileStream.Create(name, fmCreate);
  Stream.Write(DataCount,Sizeof(DataCount));
  try
    FilterConfigData.Store(Stream);
  finally
    Stream.Free;
  end;
end;

function TFilterConfigBase.Process:Integer;
Begin
End;

end.

Beste Grüsse und vielen Dank
Geri
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Mo 17.04.06 18:01 
Mit virtual willst du doch erreichen, dass die konkrete Methode der Tochterklasse aufgerufen wird und nicht die der Parent-Klasse. Folglich muss auch jede konkrete Implementierung diese Methode implementieren und damit sie aufgerufen wird auch überschreiben. Gleichzeitig steht glaube ich in der Hilfe, dass dynamic oder virtual immer nur mit abstract verknüpft sinn macht logisch denn, der Sinn daran ist ja dass immer nur Methoden der Tochterklasse aufgerufen werden, weshalb eine Delegierung der Implementation per abstract auch adäquat scheint. Wenn du die Basismethode "speichern" deiner Basisklasse ebenfalls dynamisch aufrufen möchtest geht das so nicht. Also ergänze einfach an den entsprechenden Stellen abstract und override.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 17.04.06 18:11 
Das muss nicht Overload heißen, sondern override...

Ansonsten scheint das so zu stimmen ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Geri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: Mo 17.04.06 20:29 
Hallo Allesquarks und BenBE

Super, vielen Dank. Ich habe gleich die Schlüsselwörter overload in der Deklaration von TDxfImportFilterConfigData in override geändert.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  TDxfImportFilterConfigData = Class(TFilterConfigData)
                                      ImportLayerName:Array[0..MaxLayer] of String;
                                      LayerID: Array[0..MaxLayer-1of Integer;
                                      ToolID:Array[0..MaxTool-1of Integer;
                                      Procedure Store(s:TFileStream); override;
                                      Procedure Load(s:TFileStream); override;



Juhui, und nun funktioniert es ganz genau so, wie ich es mir vorgestellt habe. :D :D :D

Super!!!!
Vielen Dank für Eure Mühe und den wertvollen Tipp, ihr habt mir wirklich sehr geholfen.

Geri