Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Positionen mehrerer TImage speichern (https://www.delphipraxis.net/66512-positionen-mehrerer-timage-speichern.html)

smart 30. Mär 2006 16:41


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

Die Muhkuh 30. Mär 2006 16:54

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]

smart 30. Mär 2006 17:00

Re: Positionen mehrerer TImage speichern
 
Vielen Dank, Spider! Damit komme ich weiter.

Heike

Die Muhkuh 30. Mär 2006 17:04

Re: Positionen mehrerer TImage speichern
 
Zitat:

Zitat von smart
Vielen Dank, Spider! Damit komme ich weiter.

Heike

Bitte,

alternativ könntest du noch sowas machen:

Delphi-Quellcode:
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;
Der Aufruf wäre dann:

Delphi-Quellcode:
SaveImage(Image1);
SaveImage(ImageTop);
SaveImage(ImageBottom);

// bzw.

LoadImage(Image1);
LoadImage(ImageTop);
SaveImage(ImageBottom);
Dann wäre der Name des Images eigentlich egal :)

smart 30. Mär 2006 17:23

Re: Positionen mehrerer TImage speichern
 
Zitat:

Zitat von Spider
Hallo Heike,

wenn deine Images Image0..Image29 heißen, ist das sehr einfach:

Delphi-Quellcode:
      Ini.WriteInteger('Image' + IntToStr(I), 'Left', Image.Left);
Ist jetzt aussem Kopf geschrieben, sollte aber funktionieren :)

Hier bekomme ich eine Zugriffsverletzung. Obwohl der Code an sich richtig ist. Ne Idee was da falsch läuft?

Heike

Die Muhkuh 30. Mär 2006 17:25

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;

smart 30. Mär 2006 17:31

Re: Positionen mehrerer TImage speichern
 
Zitat:

Zitat von Spider
Hallo Heike,

kannst du mal überprüfen, ob Image <> nil ist?

Daran hatte ich auch schon gedacht. Die Images sind nicht nil. Dann habe ich die Verletzung hier:
Delphi-Quellcode:
      if Image = nil then
        raise Exception.Create('Image ist nil');
Heike

Die Muhkuh 30. Mär 2006 17:39

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;

smart 30. Mär 2006 17:46

Re: Positionen mehrerer TImage speichern
 
Zitat:

Zitat von Spider
So müsste es jetzt funktionieren.

Spider,

der mag Image.Top und Image.Left nicht.

Heike.

Sharky 30. Mär 2006 17:47

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.

smart 30. Mär 2006 18:00

Re: Positionen mehrerer TImage speichern
 
Zitat:

Zitat von Sharky
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.

Hallo Stephan!

Oder alle doch einzeln speichern ;-) Ist, glaube ich auch nicht viel mehr Aufwand, oder?

Heike

Die Muhkuh 30. Mär 2006 18:01

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.

smart 30. Mär 2006 18:08

Re: Positionen mehrerer TImage speichern
 
Zitat:

Zitat von Spider
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.

Spider,

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

Sharky 30. Mär 2006 18:13

Re: Positionen mehrerer TImage speichern
 
Zitat:

Zitat von smart
...Ist, glaube ich auch nicht viel mehr Aufwand, oder? ...

Der Vorteil ist: Dich brauchen die Namen der Images nicht zu interessieren ;-)
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;

smart 30. Mär 2006 18:24

Re: Positionen mehrerer TImage speichern
 
Zitat:

Zitat von Sharky
Zitat:

Zitat von smart
...Ist, glaube ich auch nicht viel mehr Aufwand, oder? ...

Der Vorteil ist: Dich brauchen die Namen der Images nicht zu interessieren ;-)

Ein toller Code. So wie ich den Code verstehe, kann man damit alle Positionen von allen Comps. speichern.

Heike

Sharky 30. Mär 2006 18:37

Re: Positionen mehrerer TImage speichern
 
Zitat:

Zitat von smart
... kann man damit alle Positionen von allen Comps. speichern. ...

Mit einer kleinen änderung ist das ganz einfach möglich.

smart 30. Mär 2006 19:10

Re: Positionen mehrerer TImage speichern
 
Zitat:

Zitat von Sharky
Zitat:

Zitat von smart
... kann man damit alle Positionen von allen Comps. speichern. ...

Mit einer kleinen änderung ist das ganz einfach möglich.

Hallo Stephan,

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

Sharky 30. Mär 2006 19:15

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