Autor |
Beitrag |
Geri
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: 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?
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-1] of Integer; ToolID:Array[0..MaxTool-1] of 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; function TFilterConfigBase.SaveToFile(name:String):Integer; var Stream: TFileStream; DataCount:Integer; Begin result:=-1; DataCount:=12345; 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
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: 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.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| TDxfImportFilterConfigData = Class(TFilterConfigData) ImportLayerName:Array[0..MaxLayer] of String; LayerID: Array[0..MaxLayer-1] of Integer; ToolID:Array[0..MaxTool-1] of 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.
Super!!!!
Vielen Dank für Eure Mühe und den wertvollen Tipp, ihr habt mir wirklich sehr geholfen.
Geri
|
|
|