Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ListBox mit .ini und noch einiges. (https://www.delphipraxis.net/117383-listbox-mit-ini-und-noch-einiges.html)

xShadowBoZz 17. Jul 2008 00:13


ListBox mit .ini und noch einiges.
 
Also, ich habe folgendes Problem bzw. möchte folgendes wissen.

Ich bin gerade dabei ein Program zu erstellen das einen Text in einem Memo feld darstell indem auf ein 'Item' einer ListBox klickt.
Eigentlich funktioniert das alles noch bis hier hin, ABER ich will zusätzlich die funktion anbieten eigene Texte dazu zu speichern das dann automatisch einen neuen 'Item-'eintrag in der ListBox mit 'Wunschname' erstellt.
Das kriege ich wahrscheinlich auch noch hin, aber hier kommt dann das Problem, ich weiß nicht wie ich diesen Eintrag abspeichern soll.
Ich dachte daran das ganz einfach als textdokument in einem Unterordner zu speichern (was ich auch hinkriege) aber wie soll ich beim starten des Programs den Eintrag automatisch wiederherstellen?
Ich will also alle Dateien in einem Unterordner mit Namen(Dateiname) in der Listbox darstellen und das auch so machen das wenn ich auf diesen 'selbsterstellten' Eintrag drauf klick, dass der Text in der Memo steht.
Ich habe mir gedacht das man das irgendwie mit .ini Files hinkriegt.
zb. das bei einem neuen Eintrag der Name und der Pfad des Eintrags/Datei in der .ini Datei abgespeichert wird.
Und das beim laden dieser Pfad genutzt wird zum öffnen/lesen der Datei.

.ini file aufbau:
[Section]
Blabla=blabla2

könnte aussehn beim Program:
[NameDerDatei]
Pfad=PfadDerDatei
------------------
Also kurz:
1. Wie könnte ich den [NameDerDatei] in eine ListBox laden? bzw. alle vorhandenen [NameDerDatei] , da es ja mehrere Einträge gibt.
2. Wie kann ich den PfadDerDatei mir so zu nutze machen, das ich beim anklicken von [NameDerDatei] in der ListBox der PfadDerDatei geladen wird?
3. Oder gibt eine andere möglichkeit an die ich nicht gedacht habe?

Ich hoffe ihr versteht was ich meine.
Na dann, danke falls ihr helfen könnt.

mkinzler 17. Jul 2008 00:25

Re: ListBox mit .ini und noch einiges.
 
Ein TStrings kennt die Methoden .SaveToFile() und .LoadFromFile()

Hansa 17. Jul 2008 01:29

Re: ListBox mit .ini und noch einiges.
 
Das hier ist jetzt auf eine abgeleitete Form bezogen, um die Fensterkoordinaten des jeweiligen Windows eines Benutzers direkt zu speichern (Achtung ! Prozedur ist verkürzt, ohne C+P Garantie !) :

Delphi-Quellcode:
procedure Tfrm.FormClose(Sender: TObject;
  var Action: TCloseAction);
var FensterIni : TIniFile;
begin
  inherited;
  try
    FensterIni := TIniFile.Create(FensterDateiName); // Dateiname projektbezogen und global
    FensterIni.WriteInteger(Name,'Left',Left);
    FensterIni.WriteInteger(Name,'Top',Top);
  end;
  finally
    FensterIni.Free;
  end;
  Action := caFree;
end;
Je nachdem, welchen Dateinamen man wählt, können damit recht einfach ganze User-"Profile" notfalls einfach umkopiert werden. In ähnlicher Weise können die Items der Listbox etc. behandelt werden.

p0w3r5tr34m3r 17. Jul 2008 06:43

Re: ListBox mit .ini und noch einiges.
 
Zitat:

Zitat von xShadowBoZz
1. Wie könnte ich den [NameDerDatei] in eine ListBox laden? bzw. alle vorhandenen [NameDerDatei] , da es ja mehrere Einträge gibt.
2. Wie kann ich den PfadDerDatei mir so zu nutze machen, das ich beim anklicken von [NameDerDatei] in der ListBox der PfadDerDatei geladen wird?
3. Oder gibt eine andere möglichkeit an die ich nicht gedacht habe?

falls du das mit inis machen willst würde ich vorschlagen das du dir die Unit IniFiles in der OH anguckst...


zu 1. ini.ReadSections(myListbox); // liest alle abschnitte aus der ini in myListbox
zu 2. myListbox.LoadFromFile(filename); // lädt die daten aus filename in myListbox
zu 3. z.B. XML, typisierte Dateien


MfG

Blackheart 17. Jul 2008 07:58

Re: ListBox mit .ini und noch einiges.
 
Ini Tutorial

xShadowBoZz 17. Jul 2008 14:08

Re: ListBox mit .ini und noch einiges.
 
ok danke erstmal hat mir schon geholfen, vorallem des 'ini.ReadSections(ListBox1.Items);' hab diese funktion nähmlich erst nicht verstanden aber momentan benutze ich sie.

ich zeig euch erstmal was ich sozusagen gebastelt habe.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject); //Buttonclick erstellt neuen eintrag in ini-file
var ini:Tinifile; // var, versteht sich von selbst.
begin //...
  Ini:=TIniFile.Create('D:\data.ini'); //ini-file in D: namens data.ini, wird erstellt falls noch nicht vorhanden
    try
      Ini.WriteString(Edit1.Text,'Path','C:\Dokumente und Einstellungen\Andreas\Desktop\'+Edit1.Text+'.fdb');
//Schreibe String: Sectionname = Edit1.Text(dateiname-wunschname); Eigenschaft=Path; Daten von Path=Pfad+Wunschdateiname +.fdb endung (kann man mit Editor öffnen)
      Ini.ReadSections(ListBox1.Items); //Aktualisiert die LIstBox ^^
    finally
  ini.Free;
end;
end;
ist jetzt ein wenig 'abgespeckt' werde dazu noch was schreiben (ist net schwierig) was den Text von Memo1 in die 'datei' reinschreibt.
Dazu werd ich den code:
Delphi-Quellcode:
      Ini.ReadSections(ListBox1.Items); //Aktualisiert die LIstBox ^^
in Form1 OnActivate nochmal reinkopieren.
Bis hier funktioniert noch alles gut aber ich habe noch ein Problem.

Ich will ja das der Text der datei in ein Memo per OnClick/OnKeyUp/etc der ListBox geladen wird.
Sonst habe ich das immer so gemacht:
Beispiel ist mit OnClick:
Delphi-Quellcode:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
If ListBox1.Selected[ZAHL] then
Memo1.Lines.LoadFromFile('PfadDerDatei');
If ListBox1.Selected[AndereZAHL] then
Memo1.Lines.LoadFromFile('PfadZurAnderenDatei');
....
end;
Nur wenn ich einen neuen Eintrag erstelle kann ich doch nicht einfach 'eine neue Zeile' hinzufügen.
Damit meine ich das ich nicht einfach das
If ListBox1.Selected[AndereZAHL] then
Memo1.Lines.LoadFromFile('PfadZurAnderenDatei');
einfach so in das Program '(r)einfügen' kann.

Also brauche ich irgendeine Funktion die sagt
Delphi-Quellcode:
If ListBox1.Selected[SectionName in der .ini File] then
Memo1.Lines.LoadFromFile(ListBox1.Selected[SectionName in der .ini File.ReadString(ListBox1.Selected[...],'Path','-')]);
Das Funktioniert natürlich nicht.
Aber hierzu ma die erklärung:

Der ausgewählte name in der ListBox (ListBox1.Selected[...]) ist zugleich der Name der Section in der .ini File.
Dann wird in die Memo1 die Daten der Eigenschaft der Section geladen (das hier ist dann der Pfad, falls nichts vorhanden wird jetzt in diesem Fall '-' geladen, was natürlich net geht).

hmm ist glaub ich ein bisschen schwer zu verstehen, aber ich hoffe hier kapiert es einiger maßen ^^

kurz gesagt:
Ich brauch eine Funktion die ich in ein Ereigniss der LIstBox einbauen kann, die bewirkt das beim anklicken/markieren eines Items der ListBox der dazugehörige Text in die Memo geladen wird.

MfG

xShadowBoZz 17. Jul 2008 17:10

Re: ListBox mit .ini und noch einiges.
 
hmm ncoh keine Antwort bekommen ^^ naja
hab da noch ein bisschen dran rumprobiert.
Brauche nurnoch einen entscheidenden Abschnitt/Punkt um alles zum laufen zu kriegen.

(sorry falls ich ein paar codeing probleme hab^^ aber es funktioniert)
Delphi-Quellcode:
procedure blabla ...
var ini:TInifile;
begin
  Ini:=TInifile.Create('D:\data.ini');
  Memo2.Lines.LoadFromFile(Ini.ReadString(ListBox1.Items.Strings[3],'Path',''));
end;
Also das funktioniert, theoretisch würde ich das dann alles so aussehen lassen in einer OnClick/OnKeyUp/etc procedure der ListBox.

Delphi-Quellcode:
procedure ...
var ini:TInifile;
begin
ini:=TIniFile.Create('D:\data.ini');
If ListBox1.Selected[0] then
Memo2.Lines.LoadFromFile(Ini.ReadString(ListBox1.Items.Strings[0],'Path',''));
If ListBox1.Selected[1] then
Memo2.Lines.LoadFromFile(Ini.ReadString(ListBox1.Items.Strings[1],'Path',''));
// usw
...
end;
aber so wird es im endeffekt nicht korrekt funktionieren, deswegen brauch ich einen code and folgernder Stelle
Delphi-Quellcode:
  Memo2.Lines.LoadFromFile(Ini.ReadString(ListBox1.Items.Strings[X],'Path',''));
An dieser Stelle das 'X'
Und an dieser Stelle brauch ich etwas was sagt 'was gerade in der ListBox markiert ist', erst hab ich rumprobiert ob ich das mit ListBox1.Selected[] hinkrieg, hab ihc aber net wegen den zwei '[]', gibt es nicht einen einfachen 'trick' der sagt Listbox1.WasMarkiertIst;???


MfG

marabu 17. Jul 2008 20:32

Re: ListBox mit .ini und noch einiges.
 
Hallo Andreas,

vielleicht suchst du das hier:

Delphi-Quellcode:
procedure TDemoForm.ListBoxClick(Sender: TObject);
var
  fn: TFileName;
begin
  with Sender as TListBox do
    if ItemIndex > -1 then
    begin
      fn := ini.ReadString(Items[ItemIndex], 'PATH', '');
      Memo.Items.LoadFromFile(fn);
    end;
end;
Freundliche Grüße

Blackheart 17. Jul 2008 21:31

Re: ListBox mit .ini und noch einiges.
 
Listbox Itemindex, was hatt das mit ini zu tun :gruebel:

xShadowBoZz 17. Jul 2008 22:26

Re: ListBox mit .ini und noch einiges.
 
Zitat:

Zitat von marabu
Hallo Andreas,

vielleicht suchst du das hier:

Delphi-Quellcode:
procedure TDemoForm.ListBoxClick(Sender: TObject);
var
  fn: TFileName;
begin
  with Sender as TListBox do
    if ItemIndex > -1 then
    begin
      fn := ini.ReadString(Items[ItemIndex], 'PATH', '');
      Memo.Items.LoadFromFile(fn);
    end;
end;
Freundliche Grüße

ok thx trotzdem, habs vor ein paar stunden selber hingekriegt als niemand geschrieben hat xD
ich glaub ich habs evtl. ein bisschen komplizierter aber es funktioniert.
allerdings kommen manchma error wie zb. wenn iche min. 1 eintrag in der listbox habe und ich dann ins freie klicke, kommt fehler meldung 'Listenindex überschreitet das maximum -1', wird bei dir wahrscheinlich nicht der fall sein.
und auserdem kommt bei mir beim close button ein error o.O muss aber wohl an was anderem liegen.

also hier mein code ^^

Delphi-Quellcode:
procedure TForm1.ListBox1Click(Sender: TObject);
var ini:TInifile;
begin
  Ini:=TInifile.Create('.\db\data.ini');
  Memo2.Lines.LoadFromFile(Ini.ReadString(ListBox1.Items.Strings[Listbox1.ItemIndex],'Path',''));
end;
also die zeile ist ja richtig bei mir geworden zumindestens ist es das gleiche wie bei dir.
Memo2.Lines.LoadFromFile(Ini.ReadString(ListBox1.I tems.Strings[Listbox1.ItemIndex],'Path',''));

und soviel ich weiß oder denk wird mit
Delphi-Quellcode:
  with Sender as TListBox do
    if ItemIndex > -1 then
der listenindex error entfernt. richtig?

@Blackheart:
ehm ka, ich glaub der ganze thread erklärts dir schon irgendwie ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 Uhr.
Seite 1 von 2  1 2      

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