AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListView - Mache ich was Falsch?

Ein Thema von milos · begonnen am 9. Apr 2015 · letzter Beitrag vom 9. Apr 2015
Antwort Antwort
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#1

ListView - Mache ich was Falsch?

  Alt 9. Apr 2015, 16:16
edit: bild hinzugefügt

Hallo,

ich muss zum testen mehrere Personen aus zufallsnamen generieren und diese dann darstellen.
Ich habe 2 Funktionen.
Die 1. zum generieren und die 2. zum Laden.

Beim Generieren wird die Liste richtig dargestellt, aber beim Laden werden fälschlicherweise immer die vorherigen Werte aus der Liste übernommen.

Meine Frage ist, mache ich hier was falsch und sehe es nach 10 minuten immer noch nicht oder muss das Problem in der TBinObject klasse liegen?
Delphi-Quellcode:
procedure TForm1.btn2Click(Sender: TObject);
var
  bin : TBinObject;
  c: Integer;

  LListItem : TListItem;

  LBinItem : TBinItem;
  x: Integer;

  StartTime : TDateTime;
begin
  bin := TBinObject.Create;
  bin.LoadFromFile('personen.txt');
  lv1.Clear;

  StartTime := Now;
  for c := 0 to bin.Count-1 do
  begin
    LBinItem := bin[c];

    LListItem := lv1.Items.Add;
    LListItem.Caption := ByteListToString(LBinItem[0]);

    for x := 1 to LBinItem.Count-1 do
    begin
      LListItem.SubItems.Add(ByteListToString(bin[c][x]))
    end;
  end;

  lbl2.Caption := FloatToStr(MilliSecondsBetween(now,starttime)/1000)+'s';
end;
Im vergleich dazu, das generieren.

Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
  c: Integer;
  x: Integer;
  StartTime : TDateTime;
  Bin : TBinObject;

  AListItem : TListItem;

  LVorname, LNachname : string;
begin
  Bin := TBinObject.Create;
  StartTime := Now;
  lv1.Clear;
  for c := 0 to StrToInt(lbledt1.Text)-1 do
  begin
    LVorname := mmo1.Lines[Random(mmo1.Lines.Count)];
    LNachname := mmo2.Lines[Random(mmo2.Lines.Count)];


    Bin.Add(TBinItem.Create);

    Bin[c].Add(StringToByteList(c.ToString()));
    Bin[c].Add(StringToByteList(LVorname));
    Bin[c].Add(StringToByteList(LNachname));


    AListItem := lv1.Items.Add;
    AListItem.Caption := c.ToString();
    AListItem.SubItems.Add(LVorname);
    AListItem.SubItems.Add(LNachname);

    Caption := c.ToString();
  end;

  Bin.SaveToFile('personen.txt');


  lbl2.Caption := FloatToStr(MilliSecondsBetween(now,starttime)/1000)+'s';
end;
Einzelne Werte funktionieren ohne probleme und ich wüsste wirklich nicht mehr wo suchen.

Freundliche Grüsse
Miniaturansicht angehängter Grafiken
y0oi.jpg  
Milos
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#2

AW: ListView - Mache ich was Falsch?

  Alt 9. Apr 2015, 16:26
Um da überhaupt etwas zu sagen zu können, solltest Du die Deklaration von TBinObject und TBinItem zur Verfügung stellen. Vorher kann man da nur mit arbeiten.
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

AW: ListView - Mache ich was Falsch?

  Alt 9. Apr 2015, 16:27
Lass Dir doch ByteListToString(LBinItem[0]) mal ausgeben, dann siehst Du, ob das schon nicht stimmt. Ohne die Klasse zu kennen kann man aber nicht mehr sagen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: ListView - Mache ich was Falsch?

  Alt 9. Apr 2015, 16:39
Man könnte fast denken jemand hab bei ByteListToString vergessen das Result zu initialisieren,
aber da diese Funktion streng geheim ist, wird da keiner helfen können.
$2B or not $2B
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: ListView - Mache ich was Falsch?

  Alt 9. Apr 2015, 16:41
Müsste das:
LListItem.SubItems.Add(ByteListToString(bin[c][x])) nicht so
LListItem.SubItems.Add(ByteListToString(LBinItem[x])) sein? Oder ist es egal?

Und beim generieren zum Testen mal ersetzen:
Delphi-Quellcode:
AListItem.Caption := c.ToString();
AListItem.SubItems.Add(LVorname);
AListItem.SubItems.Add(LNachname);

//durch

AListItem.Caption := ByteListToString(bin[c][0]);
AListItem.SubItems.Add(ByteListToString(bin[c][1]));
AListItem.SubItems.Add(ByteListToString(bin[c][2]));
Ralph

Geändert von Jumpy ( 9. Apr 2015 um 16:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: ListView - Mache ich was Falsch?

  Alt 9. Apr 2015, 16:42
Zitat:
LBinItem := bin[c];
Frage beantwortet?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
510 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: ListView - Mache ich was Falsch?

  Alt 9. Apr 2015, 16:44
bin.LoadFromFile('personen.txt'); bzw. Bin.SaveToFile('personen.txt');
Bist du sicher das immer das richtige Verzeichnis beim Laden bzw. Speichern der Datei verwendet wird? Ich würde hier mal den vollständigen Pfad verwenden z.B. unter zuhilfenahme von ExtractFilePath(ParamStr(0)) + 'personen.txt'); oder ähnlichen Funktionen da ich jetzt nicht weiß wo deine Textdatei später liegen soll.

[EDIT]
Ausserdem wird in beiden Prozeduren Bin := TBinObject.Create; aufgerufen, aber nie wieder freigegeben. Keine Ahnung was das für Auswirkungen in deinem Projekt haben könnte.

Geändert von ringli ( 9. Apr 2015 um 17:31 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: ListView - Mache ich was Falsch?

  Alt 9. Apr 2015, 17:05
Zitat:
LBinItem := bin[c];
Frage beantwortet?
War mir ja eigentlich klar, dass das für den Fehler wahrsch. irrelevant ist. Ich wollte nur drauf hinaus, das man entweder LBinItem komplett weg lassen kann und immer bin[c] nimmt, oder wenn man schon LBinItem als Zwischenvariable nutzt immer damit arbeitet.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: ListView - Mache ich was Falsch?

  Alt 9. Apr 2015, 19:12
Man könnte fast denken jemand hab bei ByteListToString vergessen das Result zu initialisieren,...
Oups, genau das war es vielen dank

Und nein, die Klasse ist natürlich nicht geheim, nur bisschen Quick & Dirty, war mir aber fast sicher, dass der Fehler in der Form Klasse steckt

Hier der Code für die interessierten.
Es handelt sich dabei um eine unit um Binärdateien im folgenden format auszulesen und zu schreiben.
STX Wert ETX Wert ETX Wert ETX ... EOT

STX: Start of Text - Startet einen neuen Datensatz Bytewert: 0x02
ETX: End of Text - Beendet den Datensatzpunkt Bytewert: 0x03
EOT: End of Transmission - Beendet den Datensatz Bytewert: 0x04

Delphi-Quellcode:
unit BinObject;

interface

uses
  Classes,
  Generics.Collections,
  SysUtils;

type
  TBinItem = class
  private
    FSubItems : TList<TList<Byte>>;
    function FGetBytes(AIndex : integer) : TList<Byte>;
    function FGetCount : integer;
  public
    procedure Add(ABytes : TList<Byte>);
    constructor Create();
    property Count : Integer read FGetCount;
    property Item[AIndex : integer] : TList<Byte> read FGetBytes; default;
  end;

  TBinObject = class
  private
    FBinaryReader : TBinaryReader;
    FBinaryWriter : TBinaryWriter;
    FItems : TList<TBinItem>;
    function FGetCount : integer;
    function FGetItem(AIndex : integer) : TBinItem;
  public
    constructor Create();
    procedure SaveToFile(AFileName : string);
    procedure LoadFromFile(AFileName : string);
    procedure Add(ABinItem : TBinItem);
    property Count : Integer read FGetCount;
    property Item[AIndex : integer] : TBinItem read FGetItem; default;
  end;


  function StringToByteList(AString : string) : TList<Byte>;
  function ByteListToString(AByteList : TList<Byte>) : string;

var
  LastResult : string;
  LastRead : string;
implementation

const
  IndexPrefix = 310;

function ByteListToString(AByteList : TList<Byte>) : string;
var
  c: Integer;
begin
  Result := '';

  for c := 0 to AByteList.Count-1 do
  begin
    Result := Result + (Ansichar(AByteList[c] - IndexPrefix));
  end;
end;

function StringToByteList(AString : string) : TList<Byte>;
var
  c: Integer;
begin
  Result := TList<Byte>.Create;
  for c := 1 to Length(Astring) do
  begin
    Result.Add(Ord(AString[c]) + IndexPrefix);
  end;
end;


{ TBinData }

procedure TBinItem.Add(ABytes: TList<Byte>);
begin
  FSubItems.Add(ABytes);
end;

constructor TBinItem.Create;
begin
  FSubItems := TList<TList<Byte>>.Create;
end;

function TBinItem.FGetBytes(AIndex: integer): TList<Byte>;
begin
  Result := FSubItems[AIndex];
end;

function TBinItem.FGetCount: integer;
begin
  Result := FSubItems.Count;
end;

{ TBinObject }

procedure TBinObject.Add(ABinItem: TBinItem);
begin
  FItems.Add(ABinItem);
end;

constructor TBinObject.Create;
begin
  FItems := TList<TBinItem>.Create;
end;

function TBinObject.FGetCount: integer;
begin
  Result := FItems.Count;
end;

function TBinObject.FGetItem(AIndex: integer): TBinItem;
begin
  Result := FItems[AIndex];
end;

procedure TBinObject.LoadFromFile(AFileName: string);
var
  TransmissionStarted : boolean;
  InValue : Boolean;
  Finished : Boolean;

  LBinItem : TBinItem;
  LByteBuffer : TList<Byte>;
  LStringBuffer : string;
  TeBuffer : TList<Byte>;
  LByte : byte;
begin
  FItems := TList<TBinItem>.Create;
  TransmissionStarted := false;
  InValue := false;
  Finished := false;
  LByteBuffer := TList<Byte>.Create;
  LBinItem := TBinItem.Create;
  LStringBuffer := '';

  FBinaryReader := TBinaryReader.Create(AFileName);

  repeat
    try
      LByte := FBinaryReader.ReadByte;

      if not(TransmissionStarted) then
      begin
        if LByte = $02 then
        begin
          TransmissionStarted := true;
          InValue := true;
          Continue
        end
        else
          raise Exception.Create('Row started wrong.');

        Exit;
      end
      else
      begin
        if InValue then
        begin

          if LByte = $04 then
          begin
            TransmissionStarted := false;

            Add(LBinItem);
            LBinItem := TBinItem.Create;

            Continue;
          end;

          if LByte = $03 then
          begin
            LBinItem.Add(StringToByteList(LStringBuffer));
            LStringBuffer := '';
            Continue;
          end;

          LByteBuffer.Add(LByte);
          LStringBuffer := LStringBuffer + AnsiChar(LByte - IndexPrefix);
        end
      end;

    except
      Finished := true;
    end;
  until (Finished);

  FBinaryReader.Close;
end;

procedure TBinObject.SaveToFile(AFileName: string);
var
  ItemIndex: Integer;
  LBinItem : TBinItem;
  SubItemIndex: Integer;
  LSubItem : TList<byte>;
  LByte : byte;
  ByteIndex: Integer;
begin
  FBinaryWriter := TBinaryWriter.Create(AFileName);

  LastResult := '';
  for ItemIndex := 0 to Count-1 do
  begin
    FBinaryWriter.Write($2);
    LastResult := LastResult+'2 ';

    LBinItem := Item[ItemIndex];
    for SubItemIndex := 0 to LBinItem.Count-1 do
    begin
      LSubItem := LBinItem.Item[SubItemIndex];
      for ByteIndex := 0 to LSubItem.Count -1 do
      begin
        LByte := LSubItem[ByteIndex];
        FBinaryWriter.Write(LByte);
        LastResult := LastResult+char(LByte);

      end;
        FBinaryWriter.Write($3);
    LastResult := LastResult+' 3 ';
    end;
    FBinaryWriter.Write($4);
    LastResult := LastResult+' 4';
  end;

  FBinaryWriter.Close;
end;

end.
Milos
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr.
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