Strings eines Arrays in (zweispaltiger) ListView einordnen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Strings eines Arrays in (zweispaltiger) ListView einordnen

Beitrag von ConcAPPtLab »

[GELÖST]

Hallo Leute,

das ist mein erster Beitrag also seid bitte nicht gemein :wink:

Ich bin gerade dabei mit Lazarus einen "Vokabeltrainer" zu programmieren. Also ein Programm, das einen immer die eingetragenen Vokabeln abfragt.

Nun mein Problem: Ich möchte die einzelnen Vokabeln in einer ListView (o.ä.) anzeigen lassen. Die Vokabeln sind Strings aus einem dynamischen Array (sollte das von Bedeutung sein :mrgreen: ). Dabei sollen die zu lernenden Vokabeln in einer ersten Spalte, und die Übersetzung in einer zweiten Spalte angezeigt werden. Beide Spalten haben eine Breite von 220.

Ich hab schon unglaublich viele Tutorials und Foren durchgekaut, aber nirgends hab ich was funktionierendes gefunden. Entweder gabs ne Fehlermeldung, oder es war nichts passendes dabei. Oder ICH HABS NICHT KAPIERT :). Bin nämlich erst mittelmäßiger Hobbyprogrammierer, programmiere erst seit 2-3 Monaten mit Pascal/Lazarus.

Also. Wer ne Lösung weiß und es gut erklären kann (die nötigen Einstellungen im OInspektor und Code), dann tippt euch die Finger wund :wink: :D

Besten Dank für alle Antworten schon mal im Voraus,
ConcAPPtLab
Zuletzt geändert von ConcAPPtLab am Sa 19. Apr 2014, 20:56, insgesamt 1-mal geändert.
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von wp_xyz »

Weil mir das ein bisschen nach Hausaufgabe klingt, halte ich mich mit konkreten Code-Beispielen zurück. Aber probier's mal mit einem TStringGrid. Auf http://wiki.lazarus.freepascal.org/Grid ... gsbeispiel findest du ein kleines Beispiel.

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von ConcAPPtLab »

wp_xyz hat geschrieben:Weil mir das ein bisschen nach Hausaufgabe klingt, halte ich mich mit konkreten Code-Beispielen zurück
Danke schon mal für die Antwort (ich gucke gleich den Link an).
Ich wollt nur vorher sagen: Das ist keine Hausaufgabe. Ob du mir glaubst oder nicht :)

Es wird ein Übungsprogramm für meinen Bruder, der...sagen wir mal nicht sooo gut in Französisch steht.
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von m.fuchs »

Zeig doch im Zweifelsfall einfach mal was du bereits an Quellcode hast. Einen Fehler an einem konkreten Stück zu finden, ist deutlich einfacher zu machen im Forum.

Intressant wäre die Deklaration deines Arrays, die Stellen wo es gefüllt wird und wo der ListView mit dem Array befüllt werden soll.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von wp_xyz »

Ok - dann will ich gerne etwas konkreter werden. Aber dazu bräuchte ich noch ein paar Informationen: Du sagst dass die Daten in einem Array stehen. Wie ist das aufgebaut? Ein Array mit Records? Oder ein zweidimensionales Array? Schreib einfach mal die Deklaration der Array-Elemente. Sollen die Texte in dem Grid editiert werden? Sollen neue Texte in dem Grid eingegeben werden können?

Wenn du's mit TListview probieren willst, ist hier ein Tutorial: http://forum.codecall.net/topic/74040-b ... tlistview/

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von ConcAPPtLab »

Es ist schon ein recht großes Projekt. Es hat 5 Units. Hier ist deswegen nur der Teil mit dem Array auslesen (es ist in einer Datei gespeichert) und dem schreiben in eine ListView. Aber ob man da einen FEHLER finden kann, weiß ich nicht. Das ist im Grunde rumprobiert. Ein Code von vielen Versuchen :(

Code: Alles auswählen

 
 
...
 
 
  type
    TDatensatz = record
    ID: integer;
    Name: AnsiString;
    end;
 
    TDatenarray = array of TDatensatz;
 
 
 
....
 
 
 
procedure TForm5.FormCreate(Sender: TObject);
 
var       i:Integer;
          Len : LongInt = 0;
          Stream:TStream;
          VokFr : TDatenArray;
          temp:integer=0;
 
begin
 
 
     Stream := TFileStream.Create('F:\Lazarus\Vokabeltrainer\VokFr.txt', fmOpenRead);
 
         try
            Stream.Read(Len, SizeOf(Len));
 
            temp:=Length(VokFr);
 
            SetLength(VokFr, Len);
 
            ListView1.TListViewCreate;
 
            for i := 0 to Len -1 do
            begin
                       Stream.Read(VokFr[i].ID, SizeOf(VokFr[i].ID));
                       Stream.Read(Len, SizeOf(Len));
                       SetLength(VokFr[i].Name, Len);
                       Stream.Read(PChar(VokFr[i].Name)^, Len);
 
                       try
                       ListView1.Add(Pointer(VokFr[i].Name));
                       ListView1.Items[i]:=VokFr[i].Name;
                       ListView1.Add(Pointer(VokFr[i]).Name);
                       ListView1.Items.Subitems[i+1]:=VokFr[i+1].Name;
 
                       finally
                       Liste.Free;
                       end;
 
            end;
 
         finally
                Stream.Free;
         end;
 
 
end;
Aber vielleicht weißt du ja was fehlt.

Der Link von dir ist übrigens gut, Danke. Nur, wie würde ich da die graue Spalte (links) und die graue Zeile (oben) wegbekommen...
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von wp_xyz »

Stehen die Dateisätze in einer Textdatei, d.h. kannst du die Datei mit dem Editor öffnen und den Inhalt im Klartext sehen?

Meinst du den Link zum StringGrid? Die grauen Bereiche links und oben gehören zu den "FixedCols" und "FixedRows". Setze die entsprechende Eigenschaft im Objektinspektor auf 0.

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von ConcAPPtLab »

Ja, ich kann die Datei öffnen.

Ja, ich meine den Link. Dankeschön
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von ConcAPPtLab »

Ok. Ich hab jetzt ein bisschen rumprobiert und das Tutorial von wp_xyz auf das Programm angepasst. Ich kann jetzt zumindest eine ListView befüllen. Das Array da rein zu bringen wird nicht so schwer sein. Danke an euch beide. Ihr habt mir beide sehr geholfen :)

Man sieht sich
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von ConcAPPtLab »

Eine Frage noch: wie kann ich das hier als "Gelöst" markieren ? :oops:
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von wp_xyz »

okay - also wenn die Datei eine Textdatei ist, liest du sie am einfachsten mit einer StringList ein (Achtung: immer genau hinsehen: es gibt eine StringList, ein StringGrid, eine ListBox, eine ListView, ... - das ist jedesmal etwas anderes). Eine StringList wirkt nach außen wie ein Array von Strings. Jede Zeile der Datei steht in einem String der Liste.

Code: Alles auswählen

 
procedure DateiEinlesen(DateiName: String);
var
  list: TStringList;
  id: String;
  VokName: String;
//...
  list := TStringList.Create;
  try
    // Datei in Stringliste einlesen
    list.LoadFromFile(DateiName);
    // Zeilenweise auswerten und ins Datenarray übertragen
    SetLength(VokFr, list.Count);
    for i := 0 to list.Count-1 do begin
      // jede Zeile der Datei steht in list[i]. 
      // Die folgende, noch zu schreibende Routine macht die Aufspaltung von ID und Vokabelname:
      TextTrennen(list[i], id, VokName);
      VokFr[i].ID := StrToInt(id);
      VokFr[i].Name := VokName;
    end;
  finally
    list.Free;
  end;
end;
 
procedure TForm1.DatenAnzeigen;  
var
  i: Integer;
  item: TListItem;
begin
  ListView1.Items.BeginUpdate;  // Neuzeichnen unterbinden
  try
    Listview1.Items.Clear;
    for i:=0 to High(VokFr) do begin
      item := TListView.Items.Add;
      item.Caption := IntToStr(VokFr[i].ID);
      item.SubItems.Add(VokFr[i].Name);
    end;
  finally
    ListVIew1.Items.EndUpdate;
  end;
end;
 
Es fehlt noch die oben erwähnte Routine "TextTrennen". Dazu müsste ich wissen, wie die Zeilen der Datei aufgebaut sind, insbesondere welches Zeichen zwischen "ID" und "Name" steht.
Eine Frage noch: wie kann ich das hier als "Gelöst" markieren ?
Den Titel des ersten Eintrags editieren. In dem weiter oben geposteten Code steckt aber noch ne Menge Fehler. "Gelöst" ist das noch nicht...

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von ConcAPPtLab »

Vielen Dank für deine Mühe. Ich habs jetzt ins Programm eingetragen und es funktioniert wunderbar :)
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von ConcAPPtLab »

In dem weiter oben geposteten Code steckt aber noch ne Menge Fehler. "Gelöst" ist das noch nicht...
Also. Ich hab jetzt diesen Code angewendet (erstellt mithilfe deines Links) und es funktioniert supi:

Code: Alles auswählen

 
{Es besteht eine Verbindung zwischen Unit1 und Unit5}
 
type
    TDatensatz = record
    ID: integer;
    Name: AnsiString;
    end;
 
    TDatenarray = array of TDatensatz;
 
...
 
procedure TForm1.LabelLISTEMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
 
   Item: TListItem;
   i:Integer;
   Len : LongInt = 0;
   Stream:TStream;
   VokFr : TDatenArray;
   temp:integer=0;
begin
    Shape16.Width:=Shape16.Width-20;
    Shape9.Left:=Shape9.Left-20;
    LabelListe.Left:=LabelListe.LEFT-10;
 
    Application.ProcessMessages;
    Sleep(100);
 
    {Aufruf des Arrays}
 
      Stream := TFileStream.Create('F:\Lazarus\Vokabeltrainer\VokFr.txt', fmOpenRead);
 
         try
            Stream.Read(Len, SizeOf(Len));
 
            SetLength(VokFr, Len);
 
            for i := 0 to Len -1 do
            begin
 
                       Stream.Read(VokFr[i].ID, SizeOf(VokFr[i].ID));
                       Stream.Read(Len, SizeOf(Len));
                       SetLength(VokFr[i].Name, Len);
                       Stream.Read(PChar(VokFr[i].Name)^, Len);
 
                       if (i mod 2 = 0) or (i=0) then         //Befüllen der Zellen
                       begin
                         Item:=Form5.ListView1.Items.Add;
                         Item.Caption := VokFr[i].Name;
                       end
                       else
                       begin
                         Item.SubItems.Add((VokFr[i].Name));
                       end;
 
 
            end;
 
         finally
                Stream.Free;
 
         end;
 
      Form5.Show;
end;
 
Fertig. Funkt prima (zumindest für mich :))

Wenn du noch'n Einwand was hast, sag's bitte.

ConcAPPtLab
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von wp_xyz »

Ich weiß nicht, ob diese Merkwürdigkeit von dir beabsichtigt ist, bzw. ob das eine andere Aktion im rechtlichen Code kompensiert. Es ist auf jeden Fall unschön programmiert, und auch wenn's funktioniert, wird's dir bei der nächsten Aktualiserung, wenn du die Details vergessen hast, eine Debug-Session bescheren:

Code: Alles auswählen

 
    Shape16.Width:=Shape16.Width-20;
    Shape9.Left:=Shape9.Left-20;
    LabelListe.Left:=LabelListe.LEFT-10;
 
Das heißt, dass Shape16 mit jedem MouseUp um 20 Pixel schmäler wird und Shape9 um 20 Pixel und LabelListe um 10 Pixel nach links rutschen...

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Strings eines Arrays in (zweispaltiger) ListView einordn

Beitrag von ConcAPPtLab »

Ja. Das ist beabsichtigt. Bei MouseDown (vorher) wurden die Shapes (Bild) um die jeweiligen Werte vergrößert. Das ist dann sone Animation wenn man auf den Knopf klickt.

Wie meinst du das mit unschön programmiert? Ich wüssst jetzt nicht was daran schlimm ist, aber du kennst dich da ja besser aus.
Dateianhänge
Button
Button
Button.png (4.95 KiB) 2481 mal betrachtet
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Antworten