Delphi-Version: 2010
overload procedure macht probleme
Gute Tag,
Und zwar folgendes. Ich habe 2 proceduren die eine Datei Laden. Die erste ist dazu da, um die Datei mit einem TOpenDialog auszuwählen. Die zweite ist zum öffnen der Datei mittels eines übergebenen Pfades.
Delphi-Quellcode:
procedure TMap.LoadMap;
var OpenDlg: TOpenDialog; listFields: TStringList; i,k,c: integer; begin OpenDlg := FormMain.dlgOpen; if OpenDlg.Execute then begin listFields := TStringList.Create; try listFields.LoadFromFile(OpenDlg.FileName); c := 0; for i := 0 to High(Playground) do for k := 0 to High(Playground[i]) do begin Playground[i][k].Free; Playground[i][k] := nil; Playground[i][k] := TField.Create(TFieldKinds(StrToInt(listFields.Strings[c][1])),i,k); case TFieldKinds(StrToInt(listFields.Strings[c][1])) of fkENTRANCE: listEntrances.Add(Playground[i][k]); fkEXIT: listExits.Add(Playground[i][k]); end; if (listFields.Strings[c][2] = '-') then Playground[i][k].nextField := TNextField(StrToInt('-' +listFields.Strings[c][3])) else Playground[i][k].nextField := TNextField(StrToInt(listFields.Strings[c][2])); Inc(c); end; finally listFields.Free; end; end; end;
Delphi-Quellcode:
Wenn ich zuerst
procedure TMap.LoadMap(fileName: string);
var listFields: TStringList; i,k,c: integer; begin listFields := TStringList.Create; try listFields.LoadFromFile('maps\' +filename +'.map'); c := 0; for i := 0 to High(Playground) do for k := 0 to High(Playground[i]) do begin Playground[i][k].Free; Playground[i][k] := nil; Playground[i][k] := TField.Create( TFieldKinds(StrToInt(listFields.Strings[c][1])) ,i,k); case TFieldKinds(StrToInt(listFields.Strings[c][1])) of fkENTRANCE: listEntrances.Add(Playground[i][k]); fkEXIT: listExits.Add(Playground[i][k]); end; if (listFields.Strings[c][2] = '-') then Playground[i][k].nextField := TNextField(StrToInt('-' +listFields.Strings[c][3])) else Playground[i][k].nextField := TNextField(StrToInt(listFields.Strings[c][2])); inc(c); end; finally listFields.Free; end; Draw(false); end;
Delphi-Quellcode:
aufrufe, klappt alles. Ich kann dannach auch die andere prozedure über
map.LoadMap(cbMaps.Items.Strings[cbMaps.ItemIndex]); // übergibt Dateinamen
Delphi-Quellcode:
aufrufen. Klappt auch.
map.LoadMap;
Doch wenn ich zuerst
Delphi-Quellcode:
und dannach
map.LoadMap;
Delphi-Quellcode:
aufrufe wirft er eine EFOpenError Exception.
map.LoadMap(cbMaps.Items.Strings[cbMaps.ItemIndex]); // übergibt Dateinamen
Als Pfad gibt er mir 'C:\ .. \maps\maps\foo.map' an. Diese Datei existiert dort auch nicht. Aber warum hängt er ein 2. 'maps\' dran? Für eure Hilfe bin ich Dankbar ;) Gruß Marc | pustekuchen |
AW: overload procedure macht probleme
Nach dem Aufruf von LoadMap befindest du dich im Verzeichnis
Code:
Jetzt rufst du LoadMap( 'foo' ) auf und dort wird ein relativer Pfad aufgerufen ausgehend von s.o.
C:\....\maps
Und das ergibt halt C:\...\maps\maps\foo.map |
AW: overload procedure macht probleme
Vielleicht noch eine kleine Vereinfachung, um sich doppelten Code zu sparen:
Delphi-Quellcode:
So kannst du LoadMap() aufrufen und es wird der Dialog angezeigt, oder LoadMap('C:\Da.tei') aufrufen und die Datei wird direkt geladen.
procedure TMap.LoadMap(fileName: string = '');
begin if not FileExists(fileName) then begin // Dialog anzeigen end; // Datei laden end; |
AW: overload procedure macht probleme
Immer dieser doppelte Code:
Delphi-Quellcode:
procedure TMap.LoadMap;
var OpenDlg: TOpenDialog; begin OpenDlg := FormMain.dlgOpen; if OpenDlg.Execute then begin LoadMap(OpenDlg.FileName); end; end; |
AW: overload procedure macht probleme
Danke @ all ;)
Zitat:
Delphi-Quellcode:
Hehe daran hab ich garnicht gedacht :D Werds morgen alles einbauen ;)
procedure TMap.LoadMap;
var OpenDlg: TOpenDialog; begin OpenDlg := FormMain.dlgOpen; if OpenDlg.Execute then begin LoadMap(OpenDlg.FileName); end; end; |
AW: overload procedure macht probleme
Das
Delphi-Quellcode:
ist auch ungünstig, denn dass setzt voraus, dass ein Datei-Öffnen-Dialog mit dem Namen dlgOpen (Übrigens eine nichtssagende Bezeichnung.) existiert. Das ist schlecht, wenn du die Klasse weiterverwenden willst, da du keine Trennung von der Oberfläche hast. Entweder du erzeugst den Dialog dynamisch in der Methode der Klasse oder du übergibst den Dialog als Parameter oder noch besser, du machst nur eine Methode mit dem Pfad als Parameter und prüfst vor dem Aufruf, ob die Datei existiert und rufst dann den Dialog auf oder nicht.
OpenDlg := FormMain.dlgOpen;OpenDlg := FormMain.dlgOpen;
Oder du machst den Pfad zu einem Attribut der Klasse. |
AW: overload procedure macht probleme
Nochmals Danke an alle ;)
Bin euren Ratschlägen gefolgt und zu folgendem Ergebnis gekommen
Delphi-Quellcode:
procedure TMap.LoadMap(fileName: string);
var listFields: TStringList; i,k,c: integer; dlgOpenMap: TOpenDialog; begin dlgOpenMap := TOpenDialog.Create(nil); listFields := TStringList.Create; fileName := fileName + MAP_FILE_EXTENSION; try if not FileExists(mapPath + fileName ) then if dlgOpenMap.Execute then fileName := ExtractFileName(dlgOpenMap.FileName); listFields.LoadFromFile(mapPath + fileName); c := 0; for i := 0 to High(Playground) do for k := 0 to High(Playground[i]) do begin Playground[i][k].Free; Playground[i][k] := nil; Playground[i][k] := TField.Create( TFieldKinds(StrToInt(listFields.Strings[c][1])) ,i,k); case TFieldKinds(StrToInt(listFields.Strings[c][1])) of fkENTRANCE: listEntrances.Add(Playground[i][k]); fkEXIT: listExits.Add(Playground[i][k]); end; if (listFields.Strings[c][2] = '-') then Playground[i][k].nextField := TNextField(StrToInt('-' +listFields.Strings[c][3])) else Playground[i][k].nextField := TNextField(StrToInt(listFields.Strings[c][2])); inc(c); end; finally listFields.Free; dlgOpenMap.Free; end; Draw(false); end; |
AW: overload procedure macht probleme
Mhh wodran kann es liegen, das wenn die Datein oft geladen werden zB 5-6x, das eine EOutOfRessources Exception mit der Meldung 'Das Handle ist ungültig'. auftritt?
EDIT: Dannach kommt noch eine EInvalidOperation Exception mit der Meldung 'Leinwand/Bild erlaubt kein Zeichnen'? EDIT2: Ok der das Programm braucht nach jedem Laden +1-2MB Ram mehr. Scheint so das ich i-wo vergessen habe die Bitmaps Freizugeben. |
AW: overload procedure macht probleme
Haqllo,
dazu müßten wir deine Draw-Methode sehen. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz