![]() |
Positionen mehrerer TImage speichern
Hallo!
Ich habe auf einer Form, 30 TImages die man bewegen kann. Nun möchte ich in einer Datei die Positionen (.Top und .Left) abspeichern. Das ganze einzeln zu machen ist sehr aufwendig, deshalb meine Frage: Ist es möglich dies mit einer Schleife zu machen. Wenn ja, wir? Gruß Heike |
Re: Positionen mehrerer TImage speichern
Hallo Heike,
wenn deine Images Image0..Image29 heißen, ist das sehr einfach: [edit2] Code falsch. Bitte weiter unten gucken [/edit2] Ist jetzt aussem Kopf geschrieben, sollte aber funktionieren :) [edit] Ich glaub, da war noch ein Fehler im Code *g* [/edit] |
Re: Positionen mehrerer TImage speichern
Vielen Dank, Spider! Damit komme ich weiter.
Heike |
Re: Positionen mehrerer TImage speichern
Zitat:
alternativ könntest du noch sowas machen:
Delphi-Quellcode:
Der Aufruf wäre dann:
procedure SaveImage(Image: TImage);
var Ini: TIniFile; begin Ini := TIniFile.Create('<Pfad, wo gespeichert werden soll>'); try Ini.WriteInteger(Image.Name, 'Left', Image.Left); Ini.WriteInteger(Image.Name, 'Top', Image.Top); finally Ini.Free; end; end; procedure LoadImage(Image: TImage); var Ini: TIniFile; begin Ini := TIniFile.Create('<Pfad, wo gespeichert werden soll>'); try Image.Top := Ini.ReadInteger(Image.Name, 'Top', 0); Image.Left := Ini.ReadInteger(Image.Name, 'Left', 0); finally Ini.Free; end; end;
Delphi-Quellcode:
Dann wäre der Name des Images eigentlich egal :)
SaveImage(Image1);
SaveImage(ImageTop); SaveImage(ImageBottom); // bzw. LoadImage(Image1); LoadImage(ImageTop); SaveImage(ImageBottom); |
Re: Positionen mehrerer TImage speichern
Zitat:
Heike |
Re: Positionen mehrerer TImage speichern
Hallo Heike,
kannst du mal überprüfen, ob Image <> nil ist?
Delphi-Quellcode:
try
for I := 0 to 29 do // Das sind 30 Images begin Image := (FindComponent('Image' + IntToStr(I)) as TImage); if Image = nil then raise Exception.Create('Image ist nil'); Ini.WriteInteger('Image' + IntToStr(I), 'Left', Image.Left); Ini.WriteInteger('Image' + IntToStr(I), 'Top', Image.Top); end; finally Ini.Free; end; |
Re: Positionen mehrerer TImage speichern
Zitat:
Delphi-Quellcode:
Heike
if Image = nil then
raise Exception.Create('Image ist nil'); |
Re: Positionen mehrerer TImage speichern
Hmm, dann kommt der Fehler bei dem If-Statement.
Hast du per Debugger schonmal überprüft, ob Image wirklich <> nil ist? :wall: Ach mist. Man sollte halt doch nicht aus dem Kopf schreiben. So müsste es jetzt funktionieren.
Delphi-Quellcode:
procedure SaveImages;
var Ini: TIniFile; I: Integer; Image: TImage; begin Ini := TIniFile.Create('<Pfad, wo gespeichert werden soll>'); try for I := 0 to 29 do // Das sind 30 Images begin Image := TImage(FindComponent('Image' + IntToStr(I))); // << Ini.WriteInteger('Image' + IntToStr(I), 'Left', Image.Left); Ini.WriteInteger('Image' + IntToStr(I), 'Top', Image.Top); end; finally Ini.Free; end; end; procedure LoadImages; var Ini: TIniFile; I: Integer; Image: TImage; begin Ini := TIniFile.Create('<Pfad, wo gespeichert werden soll>'); try for I := 0 to 29 do // Das sind 30 Images begin Image := TImage(FindComponent('Image' + IntToStr(I))); // << Image.Top := Ini.ReadInteger('Image' + IntToStr(I), 'Top', 0); Image.Left := Ini.ReadInteger('Image' + IntToStr(I), 'Left', 0); end; finally Ini.Free; end; end; |
Re: Positionen mehrerer TImage speichern
Zitat:
der mag Image.Top und Image.Left nicht. Heike. |
Re: Positionen mehrerer TImage speichern
Hai Spider und Heike,
ich würde in solch einem Fall einfach alle Komponenten der Form durchlaufen, prüfen ob es ein TImage ist und dann wie von Spider gezeigt das ganze speichern. Um die ganzen unnötigen Schreib/Lesezugriffe auf die INI-Datei zu vermeiden sollte man ausserdem mit TMemIniFile arbeiten. |
Re: Positionen mehrerer TImage speichern
Zitat:
Oder alle doch einzeln speichern ;-) Ist, glaube ich auch nicht viel mehr Aufwand, oder? Heike |
Re: Positionen mehrerer TImage speichern
Hi,
hast du auch mal überprüft, ob deine Images auch wirklich bei 0 anfangen? Ich hab gerade mal eins auf eine Form gesetzt und der Name war Image1. |
Re: Positionen mehrerer TImage speichern
Zitat:
Du hast fast Recht. Ich habe den Fehler gefunden! Es fehlte zwischen Image11 und Image13, Image12. Jetzt klapp es. Hab nochmals vielen Dank! Gruß Heike |
Re: Positionen mehrerer TImage speichern
Zitat:
Delphi-Quellcode:
uses
IniFiles; var myIniFile : string; // natürlich als private Variable. procedure SaveImagePos(aForm: TForm; aFileName : string); var ndx: Integer; PositionIni: TMemIniFile; CurrentCompo: TComponent; begin PositionIni := TMemIniFile.Create(aFileName); try for ndx := 0 to Pred(aForm.ComponentCount) do begin CurrentCompo := aForm.Components[ndx]; if (CurrentCompo is TImage) then begin with (CurrentCompo as TImage) do begin PositionIni.WriteInteger(Name, 'Top', Top); PositionIni.WriteInteger(Name, 'Width', Width); end; end; end; PositionIni.UpdateFile; finally PositionIni.free; end; end; procedure LoadImagePos(aForm: TForm; aFileName : string); var ndx: Integer; PositionIni: TMemIniFile; CurrentCompo: TComponent; begin PositionIni := TMemIniFile.Create(aFileName); try for ndx := 0 to Pred(aForm.ComponentCount) do begin CurrentCompo := aForm.Components[ndx]; if (CurrentCompo is TImage) then begin with (CurrentCompo as TImage) do begin Top := PositionIni.ReadInteger(Name, 'Top', 0); Width := PositionIni.ReadInteger(Name, 'Width', 0); end; end; end; // PositionIni.UpdateFile; // Das UpDateFile ist beim lesen natürlich blödniss gewesen. finally PositionIni.free; end; end; procedure TDemoForm.FormCreate(Sender: TObject); begin myIniFile := ExtractFilePath(ParamStr(0)) + 'position.ini'; if FileExists(myIniFile) then begin LoadImagePos(self,myIniFile); end; end; procedure TDemoForm.FormDestroy(Sender: TObject); begin SaveImagePos(self,myIniFile); end; |
Re: Positionen mehrerer TImage speichern
Zitat:
Heike |
Re: Positionen mehrerer TImage speichern
Zitat:
|
Re: Positionen mehrerer TImage speichern
Zitat:
ich möchte ja nicht meckern, aber so ganz klappt die Wiederherstellung nicht. Es klappt nur wenn ich die Position mehrere cm. verschiebe, wenn es mm sind ändert sich nichts. Obwohl die Positionen richtig gespeichert wurden. Ich werde mal versuchen woran es liegt. Gruß Heike |
Re: Positionen mehrerer TImage speichern
hihi..
Hai Heike, Du hast aber bemerkt das ich in meinem Beispiel nur die Eigenschaft Top und Width speichere aber nicht LEFT |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz