ListView: Columns[0].Width speichern

Rund um die LCL und andere Komponenten
Antworten
Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

ListView: Columns[0].Width speichern

Beitrag von Nils »

Hi,

ich habe hier gerade ein Problem zum verzweifeln:
So lese ich die Breiten der Spalten eines ListViews aus und setze sie (erfolgreich):

Code: Alles auswählen

procedure TfrmMain.FormCreate(Sender: TObject);
var Ini : TIniFile;
begin
  Ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'settings.ini');
  with Ini do
  begin
    ...
 
    with LV do
    begin
      Columns[0].Width := ReadInteger('Settings', 'C0', 50);
      Columns[1].Width := ReadInteger('Settings', 'C1', 111);
      Columns[2].Width := ReadInteger('Settings', 'C2', 200);
      Columns[3].Width := ReadInteger('Settings', 'C3', 70);
    end;
 
    Free;
  end;
end;
So speichere ich die Breiten der Spalten (klappt überhaupt nicht):

Code: Alles auswählen

procedure TfrmMain.FormDestroy(Sender: TObject);
var Ini : TIniFile;
begin
  Ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'settings.ini');
  with Ini do
  begin
    ...
 
    with LV do
    begin
      WriteInteger('Settings', 'C0', Columns[0].Width);
      WriteInteger('Settings', 'C1', Columns[1].Width);
      WriteInteger('Settings', 'C2', Columns[2].Width);
      WriteInteger('Settings', 'C3', Columns[3].Width);
    end;
 
    Free;
  end;
end;
Das ist ein Fehler der mal wieder unverständlich ist, "Lazarus, ich hasse dich" sag ich momentan noch nicht, aber wenn das so weitergeht kommt das noch.... OnDestroy wird ganz klar aufgerufen. Wenn ich zur Laufzeit via Button die Breite der ersten Spalte ausgeben lasse bekomme ich korrekte Werte und außerdem ist der Code der gleiche wie bei OnDestroy:

Code: Alles auswählen

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(LV.Columns[0].Width));
end;
Habt ihr eine Idee, woran das liegen könnte ?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ich bin dafür Posts sofort zu löschen in denen kein Fehler angegeben wird.
Ich hasse solche un aussagekräftigen Fragen !
Wie soll man jetzt bitte raus bekommen was du da für fehler bekommst ? Soll ich deine Applikation nachbasteln ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Beitrag von Nils »

Da oben steht - als Andeutung in einer Klammer - dass das Schreiben nicht so ganz klappt. Eine AV oder sonstiges ist eher unwahrscheinlich, deshalb kann man davon ausgehen, dass einfach nichts geschrieben wird. Im Klartext: In der Ini werden die 4 Werte nicht geändert.

Ich hasse so übertrieben aussagekräftige Antworten! Du hättest dir da insgesamt maximal 206 Buchstaben/Satzzeichen sparen können und der Sinn ist der gleiche.

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Hört auf mit dieser Hasserei. Ist doch kindisch.

@Nils: Probier mal das Ganze im OnClose event zu machen.

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Beitrag von Nils »

Oh, daran dachte ich früher schomal. Ich habe es aber gelassen, da ich in OnDestroy noch andere Einstellungen speichere und diese wirklich IMMER korrekt gespeichert werden. Nun hab ich das mal ins OnClose gezogen und es funktioniert. Ich weiß nicht warum, aber kann man sich ja nicht drüber beschweren, hauptsache es funktioniert, wie man in meinen Kreisen gerne sagt. Danke :).
Meine Musik: spiker-music.net

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

OnDestroy kann zu spät sein um noch Daten aus visuellen Komponenten zu lesen. OnCreate ist manchmal zu früh. Dann OnShow nehmen.

Antworten