![]() |
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:
MFG Lars W.
var
Stream: TFileStream; begin Stream := TFileStream.Create('C:\LarsPasswordSaver.dat', fmCreate); Stream.WriteComponentRes('', Form3.ListView1); Stream.Free; end; |
Re: ListView laden
![]() |
Re: ListView laden
kannste mir da n beispiel für geben; is n bisschen dringend!
|
Re: ListView laden
Ein Beispiel für was? Steht doch alles in der Hilfe?
|
Re: ListView laden
Zitat:
![]() |
Re: ListView laden
in der hilfe von delphi
|
Re: ListView laden
Zitat:
![]() |
Re: ListView laden
kann ich das auch mit ner dat datei oder nur mit text
|
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. |
Re: ListView laden
Zitat:
|
Re: ListView laden
Da fehlt ein "nicht". ;)
|
Re: ListView laden
Zitat:
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. |
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 |
Re: ListView laden
Zitat:
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. |
Re: ListView laden
Zitat:
|
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. |
Re: ListView laden
Zitat:
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:
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.
Stream := TFileStream.Create('C:\LarsPasswordSaver.dat', fmCreate);
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. |
Re: ListView laden
Zitat:
Freundliche Grüße |
Re: ListView laden
Das finde ich auch. Allerdings sollten wir nun langsam wieder zum Thema kommen, oder? ;)
|
Re: ListView laden
hi ich bins noch mal!
wenn ich das als textdatei abspeicher mit dem beispiel dann steht da nicht das richtige drin :( |
Re: ListView laden
oder geht das so nicht?
|
Re: ListView laden
Zitat:
Ich hoffe du hast nicht erwartet, dass es "leserlich", zB. im CSV-Format vorliegt oder? Denn wie aus der OH ersichtlich Zitat:
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: |
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
|
Re: ListView laden
Zitat:
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 ... |
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. |
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.
|
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 :)
|
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... |
Re: ListView laden
Zitat:
Nein kannst du nicht. Aber Excel kann CSV Dateien lesen (auch Word etc. können es) ... Zitat:
Zitat:
|
Re: ListView laden
ich bin echt noch n anfänger und kapier generell ziemlich wenig :)
|
Re: ListView laden
|
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