![]() |
Txt in Listview Laden
Hallo ich habe ein Listview die über eine Objectlist bearbeitet werden kann nun Speichere ich beim beenden die Listview in eine *.txtab. Alles kein Problem soweit.
Beim laden der txt datei fügt er sie in die Listview = kassenbuch ein das funktionier. aber sobald ich neue Sachen der Listview mit hinzufüge dann verschwinden diese. Muss ich die txt in die Objectliste einlesen??? hier mal der Code.
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
Var LoadList: TStrings; i, ActPos, PrevPos: Integer; Const Delimitter = #14; Begin LoadList := TStringList.create; Try // Laden... LoadList.LoadFromFile('c:\test.txt'); // Lösche den ListView Kassenbuch.Items.Clear; // Laufe durch Zeilen der StringList For i := 0 To pred(LoadList.Count) Do Begin PrevPos := 1; ActPos := 1; // Erste Position des Delimitters ActPos := PosEx(Delimitter, LoadList[i], succ(ActPos)); // Erstelle Item With Kassenbuch.Items.Add Do Begin // setze Caption des neuen Items Caption := Copy(LoadList[i], PrevPos, (ActPos - PrevPos)); PrevPos := succ(ActPos); // erzeuge für jeden gefundenen Delimitter ein SubItem Repeat ActPos := PosEx(Delimitter, LoadList[i], succ(ActPos)); If ActPos <> 0 Then SubItems.Add(Copy(LoadList[i], PrevPos, (ActPos - PrevPos))) Else SubItems.Add(Copy(LoadList[i], PrevPos, Length(LoadList[i]))); PrevPos := succ(ActPos); // Wenn ActPos = 0 (kein Delimitter gefunden) -> fertig Until ActPos = 0; End; End; finally end; end; |
AW: Txt in Listview Laden
Du musst Dir erst einmal über die Funktionsweise im Klaren sein, sonst stellst Du noch 200 Fragen und bist hinterher immer noch nicht schlauer. Da ist zunächst einmal die Objektliste. Diese enthält die eigentlichen Daten. Datenänderungen (Hinzufügen, Bearbeiten, Löschen) haben also immer hier zu erfolgen. Die Listview dient lediglich dazu, diese Daten zu visualisieren, daraus folgt: ändert sich etwas an den Daten, muss die ListView aktualisiert werden. Prinzipiell würde das Programm auch als Konsolenanwendung funktionieren, dann hat man eben keine Komponenten, sondern gibt sein Zeugs auf der Kommandozeile ein. Und auch bei Verwendung der VCL ist die Darstellungskomponente austauschbar, das kann die ListView, ein StringGrid, ein Memo, eine ListBox oder was weiß ich sonst noch sein. Verinnerliche dies, und schau Dir Deinen Code daraufhin noch einmal an, dann beantworten sich viele Fragen ganz von selbst.
|
AW: Txt in Listview Laden
Erstens:
Delphi-Quellcode:
Das sollte so lange klappen, solange du keine typische TStringList Funktion nutzt. Mach also besser TStringList draus.
Var
LoadList: TStrings; |
AW: Txt in Listview Laden
Will die Daten schon in die Objectliste laden das ist mir klar weil die listview ja nur die Visuelle wiedergabe darstellt. Wie müsste ich denn mit meinem Code Anfangen? Kann mann meinen Code Oben auf die Objectliste umschreiben wenn ja wie? Arbeite zum erstenmal mit Objectklassen. Also in die Listview Kriege ich sie ja aber wie Weiter???
|
AW: Txt in Listview Laden
Habe mal meinen Code umgeschrieben er sagt mir jetzt list out of Bounds(0) als Fehler
Hier der Code
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
Var Item: TListItem; LoadList: TStringlist; i, ActPos, PrevPos: Integer; Const Delimitter = #14; Begin LoadList := TStringList.create; Try // Laden... LoadList.LoadFromFile('c:\test.txt'); // Lösche den ListView Kassenbuch.Items.Clear; //Kassenbuch =Listview1 // Laufe durch Zeilen der StringList For i := 0 To pred(LoadList.Count) Do Begin PrevPos := 1; ActPos := 1; // Erste Position des Delimitters ActPos := PosEx(Delimitter, LoadList[i], succ(ActPos)); // Erstelle Item item.Data:=FObjects[i]; With FObjects[i] Do Begin // setze Caption des neuen Items Caption := Copy(LoadList[i], PrevPos, (ActPos - PrevPos)); PrevPos := succ(ActPos); // erzeuge für jeden gefundenen Delimitter ein SubItem Repeat ActPos := PosEx(Delimitter, LoadList[i], succ(ActPos)); If ActPos <> 0 Then item.SubItems.Add(Copy(LoadList[i], PrevPos, (ActPos - PrevPos))) Else item.SubItems.Add(Copy(LoadList[i], PrevPos, Length(LoadList[i]))); PrevPos := succ(ActPos); // Wenn ActPos = 0 (kein Delimitter gefunden) -> fertig Until ActPos = 0; end; end; except end; end; |
AW: Txt in Listview Laden
Zitat:
|
AW: Txt in Listview Laden
FObjects ist meine Objectliste
Zitat:
|
AW: Txt in Listview Laden
Hallo,
item ist vermutlich ein Item der Listview. So müsste es dann wohl Kassenbuch.Item [i].Data := FObjects [i] heißen. Die Frage ist nur lebt den FObjects [i] an der Stelle schon? Ich sehe, dass Du da mit LoadFromFile irgendwas einließt, aber sicher nicht an Deine ObjectList weitergibst. Gruß |
AW: Txt in Listview Laden
wie mache ich das denn mit dem weiter geben
|
AW: Txt in Listview Laden
ich habe die daten schon in die listview gebracht aber sie müssen in die Objectliste weil ich die Listview nach jeder eingabe update. wie bekomme ich denn die Übergabe zur objectlist hin?
|
AW: Txt in Listview Laden
Zitat:
|
AW: Txt in Listview Laden
Hallo,
also FObjects ist eine Property von Form1. Was für ein Datentyp hat den FObjects? Was wird in FormCreate gestartet? Hilfreich wäre Quellcode. Gruß |
AW: Txt in Listview Laden
procedure TForm1.FormCreate(Sender: TObject);
begin FObjects := TObjectlist.Create; end; |
AW: Txt in Listview Laden
Hallo,
Du ließt aus Deiner Datei c:\test.txt den Dateiinhalt in eine Stringlist ein. Dies hat nichts mit Deiner TObjectList zu tun. Du musst schon noch für die eingelesenen Inhalte aus der c:\test.txt einzelne Objekte erzeugen - die den eingelesenen Daten entsprechen - diese dann mit FObjects.Add (Object) "zeilenweise" zuweisen und später weiterverarbeiten. Aber warum der Aufwand? Schreib doch einfach den Inhalt Deiner Listview nach c:\test.txt wenn sich der Inhalt der Liste ändern sollte. Gruß |
AW: Txt in Listview Laden
weil die daten müssen gespeichert ich habe fest gestellt wenn ich die daten in die listview einlese kann ich sie nicht mehr bearbeiten bzw. wenn ich neue daten hinzufüge dann löscht er diese. Weil ich bei der eingabemaske vorher die listview cleare. wenn ich das clear für hinzufügen von daten rausnehme dann fürgt er jedesmal die davor hinzugefügten zusätzlich mit ein. ist doch mist. vor habe ich mit einem Stringgrid gearbeitet ich kann dir mal ne exe zukommen lassen dort hatte ich das problem das die Die geänderten Daten nicht aktualiesert wurden. was bei der listview kein Prob ist. gibt es denn keinen allgemeinen code zum einlsen in die Objektliste???
Zitat:
|
AW: Txt in Listview Laden
Hallo,
wenn Du mit
Delphi-Quellcode:
die Daten einliest und entsprechend in der Listview ausgibst, dann ist doch zunächst alles ok.
LoadList.LoadFromFile('c:\test.txt');
Wenn Du nun einen neuen Kassenbucheintrag hinzufügst (Kassenbuch.Items.Add) oder löscht (Kassenbuch.Items.Delete (Iregendeinindex)), dann kannst Du doch an geeigneter Stelle Deine Listview durcharbeitest und den ganzen Spaß über eine StringList abarbeiteten und in Deine Datei zurückschreiben: also
Delphi-Quellcode:
sollte es das tun.
// in einer for Schleife
Stringlist.Add (Kassenbuch.Item [i].Caption + #14 + Kassenbuch.Item [i].SubItem [0] ...)); // anschließend Stringlist.SaveToFile ('c:\test.txt'); Gruß |
AW: Txt in Listview Laden
Liste der Anhänge anzeigen (Anzahl: 1)
Das Problem ist hier jedoch das ich die daten in eine Objectliste gebe dann Formatiere und dann in die Listview ausgebe. Ich kann keine Daten die in einer Tstringlist sind ändern oder Doch und wenn wie bekomme ich dann die einzelnen Spalten Formatiert. Ich muss doch ne möglichkeit geben die daten aus der txt wieder in die Objectlist zubekommen. ich haenge mal das Prog mit als Datei mit an
|
AW: Txt in Listview Laden
- Datei in Stringliste laden
- zeilenweise zerlegen, Objekt erzeugen, Properties zuweisen und in Objektliste speichern - Stringliste freigeben - Objektliste visualisieren Mehr ist nicht zu tun. |
AW: Txt in Listview Laden
Zunächst würde ich alle Eigenschaften der DatenKlasse in
Delphi-Quellcode:
legen. Denn auf diese published Properties kann man sehr einfach zugreifen, ohne die Klasse genau kennen zu müssen.
published
Um jetzt eine beliebige
Delphi-Quellcode:
in eine Datei zu speichern oder aus ihr zu laden nimmst du einfach das hier:
TObjectList
Delphi-Quellcode:
Eine beispielhafte Verwendung findest du hier:
unit ObjLstFiler;
interface uses Contnrs; procedure SaveList( AList : TObjectList; const AFileName : string; Delimiter : Char ); procedure LoadList( AList : TObjectList; AItemClass : TClass; const AFileName : string; Delimiter : Char ); function ObjToStr( AInstance : TObject; Delimiter : Char ) : string; procedure ObjFromStr( AInstance : TObject; const AStr : string; Delimiter : Char ); implementation uses TypInfo, Classes; function ObjToStr( AInstance : TObject; Delimiter : Char ) : string; var LPropName, LPropValue : string; LPropInfo : PPropInfo; LPropCount : Integer; LPropList : PPropList; LPropType : PPTypeInfo; LIdx : Integer; LTemp : TStrings; begin LPropCount := GetPropList( AInstance, LPropList ); LTemp := TStringList.Create; try LTemp.Delimiter := Delimiter; for LIdx := 0 to Pred( LPropCount ) do begin LPropInfo := LPropList^[LIdx]; LPropType := LPropInfo^.PropType; LPropName := string( LPropInfo.Name ); case LPropType^.Kind of tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkWChar, tkLString, tkWString, tkInt64{$IFDEF UNICODE}, tkUString{$ENDIF} : begin // ReadOnly-Property if ( LPropInfo.SetProc = nil ) then Continue; LPropValue := GetPropValue( AInstance, LPropName ); LTemp.Add( LPropValue ); end; end; end; Result := LTemp.DelimitedText; finally LTemp.Free; end; end; procedure ObjFromStr( AInstance : TObject; const AStr : string; Delimiter : Char ); var LPropName, LPropValue : string; LPropInfo : PPropInfo; LPropCount : Integer; LPropList : PPropList; LPropType : PPTypeInfo; LIdx : Integer; LTemp : TStringList; LTempIdx : Integer; begin LPropCount := GetPropList( AInstance, LPropList ); LTemp := TStringList.Create; try LTemp.Delimiter := Delimiter; LTemp.DelimitedText := AStr; LTempIdx := 0; for LIdx := 0 to Pred( LPropCount ) do begin LPropInfo := LPropList^[LIdx]; LPropType := LPropInfo^.PropType; LPropName := string( LPropInfo.Name ); case LPropType^.Kind of tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkWChar, tkLString, tkWString, tkInt64{$IFDEF UNICODE}, tkUString{$ENDIF} : begin // ReadOnly-Property if ( LPropInfo.SetProc = nil ) then Continue; LPropValue := LTemp[LTempIdx]; Inc( LTempIdx ); SetPropValue( AInstance, LPropName, LPropValue ); end; end; end; finally LTemp.Free; end; end; procedure SaveList( AList : TObjectList; const AFileName : string; Delimiter : Char ); var LData : TStrings; LIdx : Integer; begin LData := TStringList.Create; try for LIdx := 0 to Pred( AList.Count ) do LData.Add( ObjToStr( AList[LIdx], Delimiter ) ); LData.SaveToFile( AFileName ); finally LData.Free; end; end; procedure LoadList( AList : TObjectList; AItemClass : TClass; const AFileName : string; Delimiter : Char ); var LData : TStrings; LIdx : Integer; LObj : TObject; begin AList.Clear; LData := TStringList.Create; try LData.LoadFromFile( AFileName ); for LIdx := 0 to Pred( LData.Count ) do begin LObj := AItemClass.Create; try ObjFromStr( LObj, LData[LIdx], Delimiter ); AList.Add( LObj ); LObj := nil; finally LObj.Free; end; end; finally LData.Free; end; end; end.
Delphi-Quellcode:
program ObjLstFile;
{$APPTYPE CONSOLE} {$R *.res} uses SysUtils, Classes, Contnrs, ObjLstFiler in 'ObjLstFiler.pas'; type TMyObject = class private FDatum : TDateTime; FInfo : string; FKonto : Integer; FWert : Currency; FMwSt : Extended; published // es werden nur diese published properties gespeichert!!! property Datum : TDateTime read FDatum write FDatum; property Info : string read FInfo write FInfo; property Konto : Integer read FKonto write FKonto; property Wert : Currency read FWert write FWert; property MwSt : Extended read FMwSt write FMwSt; end; procedure Test; var LList : TObjectList; LItem : TMyObject; LIdx : Integer; begin LList := TObjectList.Create( True ); try // 50 Objekte erzeugen while LList.Count < 50 do begin LItem := TMyObject.Create; with LItem do begin Datum := Now; Info := 'Info'; Konto := Random( 1000 ) + 1000; Wert := Random( 20000 ) / 100; MwSt := Wert * 0.19; end; LList.Add( LItem ); end; // Liste speichern SaveList( LList, 'MyList.txt', #14 ); finally LList.Free; end; LList := TObjectList.Create( True ); try // Liste aus Datei laden LoadList( LList, TMyObject, 'MyList.txt', #14 ); for LIdx := 0 to Pred( LList.Count ) do begin LItem := LList[LIdx] as TMyObject; Writeln( LItem.Datum, ' ', LItem.Info, ' ', LItem.Konto, ' ', LItem.Wert, ' ', LItem.MwSt ); end; finally LList.Free; end; end; begin try Test; except on E : Exception do Writeln( E.ClassName, ': ', E.Message ); end; ReadLn; end. |
AW: Txt in Listview Laden
tkUString undeclared identifier ???
|
AW: Txt in Listview Laden
Zitat:
|
AW: Txt in Listview Laden
Kann mann diese Geschichte nicht auf ein Stringgrid1 umschreiben ???
Delphi-Quellcode:
Mit den add Daten
procedure TForm1.DisplayData;
var Gesamt: double; i: integer; Item: TListItem; begin Gesamt := 0; Kassenbuch.Items.BeginUpdate; try Kassenbuch.Items.Clear; for i := 0 to FObjects.Count - 1 do begin Item := Kassenbuch.Items.Add; item.Caption :=(Tirgendwas(FObjects[i]).DatumAsString); Item.SubItems.Add(TIrgendwas(FObjects[i]).BelegnummerAsString); Item.SubItems.Add(TIrgendwas(FObjects[i]).EinnahmeAsString + ' €'); Item.SubItems.Add(TIrgendwas(FObjects[i]).ZweiteZahlAsString + ' €'); Gesamt := Gesamt + TIrgendwas(FObjects[i]).Summe; Item.SubItems.Add(Format('%.2n €', [Gesamt])); Item.Data := FObjects[i]; end; finally Kassenbuch.Items.EndUpdate; end; end;
Delphi-Quellcode:
Würde einiges leichtermachen
begin
if Form2.ShowModal = mrOK then begin FObjects.Add(Form2.Irgendwas); FGesamt := FGesamt + Form2.Irgendwas.Summe; sgObjects.Cells[1, sgObjects.Row] := Form2.Irgendwas.ErsteZahlAsString + ' €'; sgObjects.Cells[2, sgObjects.Row] := Form2.Irgendwas.ZweiteZahlAsString + ' €'; sgObjects.Cells[3, sgObjects.Row] := Format('%.2n €', [FGesamt]); sgObjects.RowCount := sgObjects.RowCount + 1; sgObjects.Row := sgObjects.Row + 1; end; end; |
AW: Txt in Listview Laden
Könnte der Code richtig sein
Delphi-Quellcode:
procedure TForm1.DisplayData;
var Gesamt: double; i,j: integer; begin Gesamt := 0; for i:= 0 to SGObjects.RowCount-1 do Begin sgobjects.Rows[i].BeginUpdate; try SGObjects.Rows[i].clear; for j := 0 to FObjects.Count - 1 do begin FGesamt := TIrgendwas(FObjects[j]).Summe; sgObjects.Cells[1, sgObjects.Row] := (TIrgendwas(FObjects[j]).ErsteZahlAsString + ' €'); sgObjects.Cells[2, sgObjects.Row] := (TIrgendwas(FObjects[j]).ZweiteZahlAsString + ' €'); sgObjects.Cells[3, sgObjects.Row] := Format('%.2n €', [FGesamt]); end; finally Sgobjects.rows[i].EndUpdate; end; end; sgObjects.RowCount := sgObjects.RowCount + 1; sgObjects.Row := sgObjects.Row + 1; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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