Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView laden (https://www.delphipraxis.net/103568-listview-laden.html)

Larsi 17. Nov 2007 18:43


ListView laden
 
hi,
hab mit folgendem Code ne Listview in ne dat datei gespeichert und meine frage ist jetzt wie ich das wieder laden kann!?
Delphi-Quellcode:
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create('C:\LarsPasswordSaver.dat', fmCreate);
  Stream.WriteComponentRes('', Form3.ListView1);
  Stream.Free;
end;
MFG Lars W.

Luckie 17. Nov 2007 18:51

Re: ListView laden
 
Delphi-Referenz durchsuchenTFileStream, da findest du die Lösung.

Larsi 17. Nov 2007 18:56

Re: ListView laden
 
kannste mir da n beispiel für geben; is n bisschen dringend!

Luckie 17. Nov 2007 18:58

Re: ListView laden
 
Ein Beispiel für was? Steht doch alles in der Hilfe?

Popov 17. Nov 2007 18:59

Re: ListView laden
 
Zitat:

Zitat von Luckie
Delphi-Referenz durchsuchenTFileStream, da findest du die Lösung.

Hm, in diesem Fall ist dieses Forum vollkommen nutzlos, denn letztendlich steht alles in der Delphi-Referenz durchsuchenHilfe ;)

Larsi 17. Nov 2007 19:02

Re: ListView laden
 
in der hilfe von delphi

bitsetter 17. Nov 2007 19:02

Re: ListView laden
 
Zitat:

Zitat von Larsi
hi,
hab mit folgendem Code ne Listview in ne dat datei gespeichert und meine frage ist jetzt wie ich das wieder laden kann!?
Delphi-Quellcode:
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create('C:\LarsPasswordSaver.dat', fmCreate);
  Stream.WriteComponentRes('', Form3.ListView1);
  Stream.Free;
end;
MFG Lars W.

Beispiel

Larsi 17. Nov 2007 19:05

Re: ListView laden
 
kann ich das auch mit ner dat datei oder nur mit text

Luckie 17. Nov 2007 19:22

Re: ListView laden
 
Die Dateiendung hat doh nichts mit deren Inhalt zu tun.

@Popov: Das Forum ist auch eigentlich dazu da Fragen zu beantworten, die man sich selber mit der Hilfe beantworten könnte, wenn mn sie denn benutzen täte.

Muetze1 18. Nov 2007 13:54

Re: ListView laden
 
Zitat:

Zitat von Luckie
@Popov: Das Forum ist auch eigentlich dazu da Fragen zu beantworten, die man sich selber mit der Hilfe beantworten könnte, wenn mn sie denn benutzen täte.

Ich dachte immer umgekehrt, also das wir hier Fragen beantworten, welche die Hilfe nicht beantwortet? :gruebel:

Luckie 18. Nov 2007 15:59

Re: ListView laden
 
Da fehlt ein "nicht". ;)

Popov 20. Nov 2007 03:00

Re: ListView laden
 
Zitat:

Zitat von Muetze1
Ich dachte immer umgekehrt, also das wir hier Fragen beantworten, welche die Hilfe nicht beantwortet? :gruebel:

Die Hilfe-Datei ist eine Referenzbuch, kein Tutorial und kein Lehrbuch, nur eine Referenz, gelegentlich vielleicht ein Nachschlagewerk. Zum lernen ist die Hilfe-Datei ungeeignet und beantworten tut sie auch nichts, sie beschreibt nur Funktionen, Prozeduren, etc. Die gelegentlichen Beispiele dienen dazu die Funktionsweise zu verdeutlichen. Trotzdem, aus der Hilfe kann man nicht lernen.

Auch wenn ein erfahrener Programmierer keine Probleme haben wird aus der Hilfe zu "lernen", so bedeutet es nicht, daß er tatsächlich draus gelernt hat. Beipiel: er kennt die ListBox, braucht allerdings die CheckListBox. Der nennenswerter Unterschied ist das Kontrollfeld für Checked. Da er schon die CheckBox Komponente kennt, wird er sein Wissen um die ListBox und CheckBox zum Wissen um die CheckListBox kombinieren. Die Hilfe braucht er dann nur um die genaue Handhabung zu erfahren. Lernen muß er nichts, auch wenn es für ihr das erste Mal ist wo er die Komponente nutzt, denn was soll er da neu lernen? Er wird mit keiner neuen Technik konfrontiert. Also kann ein erfahrener Programmierer sich fragen, wieso nicht auch andere einfach aus der Hilfe "lernen" wie er es doch immer tut.

Anders sieht es bei einem User der gerade neu anfängt die Sprache zu lernen. Er ist plötzlich mit einigen hundertern neunen Techniken konfrontiert und weiß nicht wo er anfangen soll. Um A zu beherrschen muß er wissen wie B funktioniert, das wiederum auf C aufbaut usw. Die Hilfe ist ihn da keine große Hilfe. Man lernt nicht aus Referenz-Büchern, wenn das so wäre bräuchte man in der ganzen Schulzeit nur ein Buch, ein Lexikon. Lernen kann man nur aus Büchern die dazu gemacht wurden zu lehren. Dazu wurde die Hilfe nicht gemacht. Der Verweis auf die Hilfe ist also unsinnig. Man könnte höchstens empfehlen einem sich ein Anfängerbuch zu kaufen, solange es Anfängerfragen sind, oder Tutorial wenn es dazu eins gibt. Aber wozu werden Tutorials geschrieben wenn doch alles was sie beschreiben doch in der Hilfe ist?

Die Frage von Lars ist also berechtigt. Wenn er TFileStream nicht beherrscht, dann kann er sich zwar alle Methoden und Eigenschaften anlesen anlesen, aber nicht unbedingt den Zusammenhang erkennen. Dazu muß er fragen oder es in einem Buch oder Tutorial anlesen. Wie gesagt, um das selbst zu können muß man schon erfahren sein, so daß es letztendlich darauf hinausläuft: wenn ich ein Mohnbrötchen mit Butter beschmieren kann, dann werde ich auch Roggenbrötchen mit Butter beschmieren können. Die Erfahrung die ich mit dem einem Brötchen gesammelt habe kann ich auf das andere übertragen.

Nun zum Sinn eines Forum. Ein Forum nennt man in der Regel auch Diskussions-Forum, wegen dem Diskutieren. Selten hört man von den Stör-uns-nicht-Forum, wo die Hauptaufgabe des Forums nicht das Diskutieren ist, sondern drauf hinzuweisen hier keine Diskussionen anzufangen.

hoika 20. Nov 2007 05:03

Re: ListView laden
 
Hallo,

sehe ich (fast) so.
Tatsache ist, es wird WriteComponentRes benutzt.
Wie viel muss ich wissen, um in der Hilfe nach WriteComponentRes zu suchen
und dann den letzten Satz

< Zum Lesen einer Komponente, die mit WriteComponentRes geschrieben wurde, rufen Sie die Methode ReadComponentRes auf.>

zu lesen ?


Heiko

Jelly 20. Nov 2007 07:17

Re: ListView laden
 
Zitat:

Zitat von Popov
Die Hilfe-Datei ist eine Referenzbuch, kein Tutorial und kein Lehrbuch, nur eine Referenz, gelegentlich vielleicht ein Nachschlagewerk. Zum lernen ist die Hilfe-Datei ungeeignet und beantworten tut sie auch nichts, sie beschreibt nur Funktionen, Prozeduren, etc. Die gelegentlichen Beispiele dienen dazu die Funktionsweise zu verdeutlichen. Trotzdem, aus der Hilfe kann man nicht lernen.

Das ist klar... Aber klar ist auch, dass es hier um ein TFileStream geht. Und da WriteComponentRes ja schon bei der Frage benutzt wird, ist es (und da teile ich Luckie's Meinung zu 100%) wohl nicht zu viel verlangt, sich mal die anderen Methoden von TFilestream anzukucken, und zwar in der Hilfe. Und wenn man WriteComponentRes kennt, ist es auch für einen Anfänger nicht allzuschwer zu erahnen, wie das Gegenstück heisst.

Stattdessen wird aber immer nach fertigem Code gefragt, verschleiert hinter dem Wort "Beispiel". Aber gewollt wird ein Codeschnipsel, das dann nur noch mit Copy&Paste eingefügt werden muss. Lerneffekt null.

Progman 20. Nov 2007 08:09

Re: ListView laden
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von Popov
Die Hilfe-Datei ist eine Referenzbuch, kein Tutorial und kein Lehrbuch, nur eine Referenz, gelegentlich vielleicht ein Nachschlagewerk. Zum lernen ist die Hilfe-Datei ungeeignet und beantworten tut sie auch nichts, sie beschreibt nur Funktionen, Prozeduren, etc. Die gelegentlichen Beispiele dienen dazu die Funktionsweise zu verdeutlichen. Trotzdem, aus der Hilfe kann man nicht lernen.

....Lerneffekt null.

Das klingt so, als maßen wir uns an, das Forum als eine schulähnliche Institution zu betrachten. Ich finde, ein gelegentliches Code-Beispiel hat manchmal mehr Aussagekraft als eine lange Erklärung. Leider ist die Tendenz festzustellen, dass immer öfter bei Fragen prompt mit Hinweis auf die Suche und die Hilfe geantwortet wird. Und das entzieht dem Forum dann seinen Sinn. Das ist meine Meinung.

Luckie 20. Nov 2007 08:23

Re: ListView laden
 
Diese Diskussion hatten wir schon öfters und gehört hier auch nicht hin. Aber jeder hat das Recht und die Freiheit so zu helfen, wie er es für richtig hält. Ein Beispiel hätte ich selber erst schreiben müssen und das wäre nicht anders ausgefallen, wie das Beispiel in der Hilfe. Ergo hätte ich gleich das Beispiel aus der Hilfe hier reinkopieren können. Und wenn ich das Beispiel ins Forum kopieren kann, dann kann jemand anders auch das Beispiel aus der Hilfe in sein Programm kopieren. Hinzukommt, dass diese Methode von TFileStream nicht übermäßig komplex ist und deren Anwendung auch einem Anfänger verständlich sein sollte.

Wenn ihr das Thema weiterdiskutieren wollt, macht bitte in "Klatsch & Tratsch" ein entsprechendes Thema auf.

Popov 20. Nov 2007 08:32

Re: ListView laden
 
Zitat:

Zitat von Jelly
... und zwar in der Hilfe. Und wenn man WriteComponentRes kennt, ist es auch für einen Anfänger nicht allzuschwer zu erahnen, wie das Gegenstück heisst.

Stattdessen wird aber immer nach fertigem Code gefragt, verschleiert hinter dem Wort "Beispiel". Aber gewollt wird ein Codeschnipsel, das dann nur noch mit Copy&Paste eingefügt werden muss. Lerneffekt null.

Zwei Punkte:

Ich hab noch nie WriteComponentRes oder ReadComponentRes selbst genutzt, also kann ich den Aufwand nicht anschätzen ohne es mir erst anzusehen. Allerdings sehe ich neben ReadComponentRes als Gegenstück schon mal eine kleine Hürde, die vor allem auch Anfänger nicht sofort lösen können, auch wenn es für erfahrene Programmierer kein Problem darstellt. Es ist die Zeile:

Delphi-Quellcode:
Stream := TFileStream.Create('C:\LarsPasswordSaver.dat', fmCreate);
Also mit fmCreate wird er bei ReadComponentRes nicht weit kommen. Das sage ich mal so ohne es selbst zu testen. Das scheint für dich und mich erstmal kein Problem zu sein, ich könnte mir aber vorstellen, daß ein Anfänger daran scheitert. Egal wie einfach das ist. Nimm also das Gegenteil davon, ist schon mal nicht.

Nun zum zweiten Punkt, dem Lerneffekt. Ich hasse dieses Wort, es ist für mich ein Unwort. Jeder benutzt es und keiner hat Pädagogik studiert. Das mit den Lerneffekt ist nicht grundsätzlich verkehrt, aber der Lehrer sagt dem Erstklässler auch nicht: wenn Du wissen willst wie man A schreibt, dann guck selber im Buch nach, dann ist auch der Lerneffekt größer. Selber machen bedeutet nicht besser oder schneller lernen.

//EDIT:

@Luckie. Auch wenn es sich vielleicht so angehört hat, es war kein Vorwurf gegen dich, sondern ein allgemeiner Kommentar.

marabu 20. Nov 2007 11:26

Re: ListView laden
 
Zitat:

Zitat von Popov
... Auch wenn es sich vielleicht so angehört hat, es war kein Vorwurf ..., sondern ein allgemeiner Kommentar.

Und ein ausgesprochen guter sogar - sehr durchdacht und ansprechend.

Freundliche Grüße

DeddyH 20. Nov 2007 12:17

Re: ListView laden
 
Das finde ich auch. Allerdings sollten wir nun langsam wieder zum Thema kommen, oder? ;)

Larsi 22. Nov 2007 18:25

Re: ListView laden
 
hi ich bins noch mal!
wenn ich das als textdatei abspeicher mit dem beispiel dann steht da nicht das richtige drin :(

Larsi 22. Nov 2007 19:11

Re: ListView laden
 
oder geht das so nicht?

Deep-Sea 23. Nov 2007 08:16

Re: ListView laden
 
Zitat:

Zitat von Larsi
hi ich bins noch mal!
wenn ich das als textdatei abspeicher mit dem beispiel dann steht da nicht das richtige drin :(

Was steht denn drin und was sollte deiner Meinung nach drin stehen? ...

Ich hoffe du hast nicht erwartet, dass es "leserlich", zB. im CSV-Format vorliegt oder?
Denn wie aus der OH ersichtlich
Zitat:

TStream.WriteComponentRes Methode
Schreibt Komponenten und deren Eigenschaften in einen Stream aus einem Ressourcedateiformat.
Speichert die Funktion es in diesem Format. Und die Dateiendung interessiert dabei keinen.

Wenn du es anders speichern willst (wie genau solltest du dann schon mal verraten), musst du es zu Fuß machen. Dafür gibt es zB. Schleifen :wink:

Larsi 27. Nov 2007 12:43

Re: ListView laden
 
Wie kann ich das denn "von Hand" machen. Also ich möchte dass so das der sowohl spalten als auch deren text als txt speichert

Deep-Sea 27. Nov 2007 12:47

Re: ListView laden
 
Zitat:

Zitat von Larsi
Wie kann ich das denn "von Hand" machen. Also ich möchte dass so das der sowohl spalten als auch deren text als txt speichert

Ja wie denn? Als CSV? Als XML?

CSV währe doch leicht:
Erst in einer Schleife die Columns durch Semikolon getrennt hinzufügen (zB. in einer TStringList mittels Add).
Dann eine Schleife die für jede Zeile die Caption und mit einer weiteren Schleife jedes SubItem durch Semikolon getrennt hintereinander hängt und auch in eine Zeile packt.
Am Ende die StringList speichern und fertig ...

Larsi 27. Nov 2007 13:03

Re: ListView laden
 
hab leider überhaupt keine Ahnubg wie du das meinst :gruebel:
was ist csv???

also das soll mal ne textdatei werden...:)

MFG Lars W.

DeddyH 27. Nov 2007 13:07

Re: ListView laden
 
CSV = Comma Separated Values, eine Textdatei, in der die "Datenfelder" durch Komma (oder ein anderes Trennzeichen) getrennt werden. So etwas kann z.B. Excel einlesen.

Larsi 27. Nov 2007 13:08

Re: ListView laden
 
kann ich das dann sowohl als txt datei als auch als excel datei abspeichern das wär ja wohl mal nützlich :)

Larsi 27. Nov 2007 13:16

Re: ListView laden
 
kann ich das dann sowohl als textdatei als auch als ecxel datei sbspeichern das wäre ja mal nützlich :)

Aber wie soll ich das code technisch hinkriegen kann mir da mal jemand ein beipsiel für geben...

Deep-Sea 27. Nov 2007 13:19

Re: ListView laden
 
Zitat:

Zitat von Larsi
kann ich das dann sowohl als textdatei als auch als ecxel datei sbspeichern das wäre ja mal nützlich :)

"Viel zu lernen du noch hast" ...
Nein kannst du nicht. Aber Excel kann CSV Dateien lesen (auch Word etc. können es) ...


Zitat:

Zitat von Larsi
Aber wie soll ich das code technisch hinkriegen kann mir da mal jemand ein beipsiel für geben...

Zitat:

Zitat von Deep-Sea
Erst in einer Schleife die Columns durch Semikolon getrennt hinzufügen (zB. in einer TStringList mittels Add).
Dann eine Schleife die für jede Zeile die Caption und mit einer weiteren Schleife jedes SubItem durch Semikolon getrennt hintereinander hängt und auch in eine Zeile packt.
Am Ende die StringList speichern und fertig ...

Nicht genau genug? :roll:

Larsi 27. Nov 2007 13:22

Re: ListView laden
 
ich bin echt noch n anfänger und kapier generell ziemlich wenig :)

Deep-Sea 27. Nov 2007 13:27

Re: ListView laden
 
http://www.delphi-forum.de/printview...075ba27e1eeab2



(*seufz* *schlechte laune*)

Opa 13. Dez 2007 23:27

Re: ListView laden
 
Das dürfte hierzu passen, es gibt andere Lösungen, diese kann u.a. auch <space> richtig schreiben.
Als Delimiter habe ich das Zeichen chr(254) genommen.
Die Konstanten
WM_LVF_ERROR, WM_LVF_COUNT, WM_LVF_END, kann man weglassen, wenn man keine Fehlermeldungen usw. haben möchte.
Code:
uses
  SysUtils,System,Classes
const
  WM_LVF_ERROR          = WM_USER               + 10;
  WM_LVF_COUNT          = WM_LVF_ERROR          +  1;
  WM_LVF_END            = WM_LVF_COUNT          +  1;
  C_LV_Delimiter   = chr(254);
//------------------------------------------------------------------------------
procedure _Explode(TS:TStrings; Sub:string; const S: string);
var//uses SysUtils,System,Classes
  S2: string;
  I: integer;
begin
  I := 0;
  S2 := S;
  TS.Clear;
  S2 := trim(S);
  if S2 = '' then exit;
  if S2 = Sub then exit;
  S2 := S2 + Sub;
  {-$R}
    repeat
      TS.Add(Copy(S2, 0,Pos(Sub, S2) - 1));
      delete(S2, 1,length(TS[I] + Sub));
      inc(I);
    until S2 = '';
  {+$R}
end;
//------------------------------------------------------------------------------
procedure TMain.SaveToFile(const DateiName: string);
var
  TS : TStringList;
  I,J : integer;
  S  : string;
begin
  try
    TS:= TStringList.Create;
    for I := 0 to (ListView.Items.Count - 1) do
    begin
      S:=IntToStr(ListView.Items.Item[I].ImageIndex)+C_LV_Delimiter+
         ListView.Items.Item[I].Caption+C_LV_Delimiter;
      for J := 0 to Items[I].SubItems.Count -1 do
      S:= S+ ListView.Items.Item[I].SubItems[J]+C_LV_Delimiter;
      S:= Copy(S,1,length(S)-1);
      TS.Add(S);
    end;
    TS.SaveToFile(DateiName);
  finally
    FreeAndNil(TS);
  end;
end;
//------------------------------------------------------------------------------
procedure TMain.LoadFromFile(const DateiName: string);
var
   TS1,TS2  : TStringList;
   ListItem : TListItem;
   I,J     : integer;
begin
    if not FileExists(DateiName) then
    begin
      //SendMessage(AHandle,WM_LVF_ERROR,longInt(@Dateiname),1);//Error 1 = keine Datei vorhanden
      Exit;
    end;
    Self.Clear;
    TS1:= TStringList.Create;
    TS2:= TStringList.Create;
    try
      TS1.LoadFromFile(DateiName);
      for I:=0 to TS1.Count-1 do
      begin
        _Explode(TS2,C_LV_Delimiter,TS1[I]);
        ListItem := ListView.Items.Add;
        ListItem.ImageIndex:=StrToInt(TS2.Strings[0]);
        ListItem.Caption :=TS2.Strings[1];
        for J:=2 to TS2.Count-1 do ListItem.SubItems.Add(TS2.Strings[J]);
        //SendMessage(AHandle,WM_LVF_COUNT,0,I);
      end;
    finally
      FreeAndNil(TS1);
      FreeAndNil(TS2);
      //SendMessage(AHandle,WM_LVF_END,0,0);
    end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 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