Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Elemente aus TStringList in Laufzeit entfernen (https://www.delphipraxis.net/198592-elemente-aus-tstringlist-laufzeit-entfernen.html)

KetchUp 23. Nov 2018 14:03

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Zitat von DieDolly (Beitrag 1418937)
Es ist eine Liste gemeint, um die Records aufzunehmen.

Dann ist es doch
Code:
List.Add(Vocab);
Aber wie deklarier ich das, sie enthält ja Strings und Integer-Werte?

DieDolly 23. Nov 2018 14:06

AW: Elemente aus TStringList in Laufzeit entfernen
 
Als aller erstes musst du verstehen, dass du deine TStringList nur brauchst, um TList zu befüllen. Danach brauchst du die TStringListe nie wieder. Alles weitere passiert über die TList wo du ja schon jetzt alle deine Vokabeln samt Zähler drin hast.

KetchUp 23. Nov 2018 15:02

AW: Elemente aus TStringList in Laufzeit entfernen
 
Die Liste funktioniert jetzt schon, ich kann sie aber nicht füllen.

Sie ist deklariert als:
Delphi-Quellcode:
var List: TList;
Wenn ich ihr aber die Vokabeln zuweise sagt der Compiler "Incompatible types: Pointer and TForm2.TVocab"
Delphi-Quellcode:
List.Add(Vocab);

p80286 23. Nov 2018 16:37

AW: Elemente aus TStringList in Laufzeit entfernen
 
das geht ungefähr so:
Delphi-Quellcode:
type
  myrecord=engtext:string;
           gertext:string;
           Repetition:integer;
    end;

var
  pmyrecord=^myrecord;


.....
  new(pmyrecord);
  pmyrecord^.engtext:=Englischertext;
  pmyrecord^.gertext:=Deutschertext;
  pmyrecord^.Repetition:=3;

 liste.add(pmyrecord);
....

procedure ListFree;
var
  pmyrecord:^myrecord;
begin
  for i:=0 to liste.count-1 do begin
    pmyrecord:=liste.item[i];
    dispose(pmyrecord);
  end;
  liste.free; //der freeandnil falls auf Nil getestet wird
end;
ohne Gewähr da nur so runter getippt;

Gruß
K-H

DieDolly 23. Nov 2018 16:41

AW: Elemente aus TStringList in Laufzeit entfernen
 
Wenn dann so :P

Delphi-Quellcode:
type
 pmyrecord = ^myrecord;

 myrecord = record
  engtext: string;
  gertext: string;
  Repetition: integer;
 end;

KodeZwerg 23. Nov 2018 17:13

AW: Elemente aus TStringList in Laufzeit entfernen
 
*entfernt*

p80286 23. Nov 2018 19:12

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Zitat von DieDolly (Beitrag 1418969)
Wenn dann so :P

:oops: zwischen Tür und Angel getippt :oops:

gruß
K-H

KetchUp 23. Nov 2018 22:05

AW: Elemente aus TStringList in Laufzeit entfernen
 
Danke für den Code aber ich blicke immer noch nicht durch :cry:

Delphi-Quellcode:
 
pmyrecord = ^myrecord; // Record declarieren. Aber warum auf einmal das "^" Zeichen?

 myrecord = record // festlegen, dass ich ein Record verwenden will?
  engtext: string; //"Container" für die englischen Vokabeln, richtig?
  gertext: string; //"Container" für die deutschen Vokabeln, richtig?
  Repetition: integer; //"Container" für die Wiederholungen, richtig?
Delphi-Quellcode:
var

  new(pmyrecord); //Was ist das?
  pmyrecord^.engtext:=Englischertext; // müsste das nicht heißen: pmyrecord^.engtext:= Vocabulary.Names[i];
  pmyrecord^.gertext:=Deutschertext; // müsste das nicht heißen: pmyrecord^.gertext:= Vocabulary.ValueFromIndex[i]
  pmyrecord^.Repetition:=3;

HolgerX 24. Nov 2018 10:42

AW: Elemente aus TStringList in Laufzeit entfernen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm..

(Wieso immer mit Records bei Listen gearbeitet wird... ;) )

Angehängt ein 'einfaches' Beispiel, wie mann mit einer TObjectList und einer Klasse für die Vokabeln einen einfaches Übungsprogramm machen kann.

Inklusive der Option, das eine falsche Lösung 3x für das Wort wiederholt werden kann und es erst dann aus der Liste entfernt wird.

Auf grafische Spielereien habe ich zunächst verzichtet, da es nur um die 'Funktion' als Beispiel geht...

Viel Spaß damit..

( Mit D6 mal so zusammen getippt ;) )

DieDolly 24. Nov 2018 12:33

AW: Elemente aus TStringList in Laufzeit entfernen
 
Also einfach sieht für einen Anfänger bestimmt anders aus :P
Dafür ist es aber korrekt und der richtige Weg.

p80286 24. Nov 2018 12:47

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Zitat von HolgerX (Beitrag 1419016)
Hmm..

(Wieso immer mit Records bei Listen gearbeitet wird... ;) )

Einfach und relativ einfach zu verstehen. OK ein Array of Record ist noch simpler, aber nach meiner Erfahrung ist eine TObjectlist/TList effizienter.

Ist aber vielleicht auch der Vorstellung geschuldet, daß ein Object komplexer ist als ein Record?

Gruß
K-H

KetchUp 24. Nov 2018 13:07

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Zitat von HolgerX (Beitrag 1419016)
Angehängt ein 'einfaches' Beispiel, wie mann mit einer TObjectList und einer Klasse für die Vokabeln einen einfaches Übungsprogramm machen kann.

Vielen Dank dafür. Jetzt müssen wir aber mal bei einer Herangehensweise bleiben (classes, records, Array of Record :cyclops:) Das Programm muss nächste Woche fertig werden.

Meinetwegen mit classes. Ich hab versucht das Programm bei mir zu implementieren. Da gibt es gleich den ersten Fehler. Compiler meint TVocableList ist nicht deklariert. Dabei stehts aber drinne.
Delphi-Quellcode:
  private
    { Private declarations }
  public
    { Public declarations }
    FWordCount : integer;
    FWordCorrect : integer;
    FRandomNumber : integer;
    FVocableList : TVocableList;
  end;

  var
    Vocabulary: TStringList;
    RandomNumber, Abfragen: Integer;
    jpgFlag, jpgCorrect, jpgWrong: TJpegImage;
    StartTime: TDateTime;
    Duration: TDateTime;
  end;
Oder wenn Records einfacher sind, kann jemand das Programm für records umschreiben?

DieDolly 24. Nov 2018 13:10

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Meinetwegen mit classes.
Ist ja nicht so als ob ich das schon vor einigen Tagen mehrfach empfohlen habe :roll::roll::roll:

Korrekt heißt es übrigens mit Klassen. Auch wenn sich classes cooler anhört.


Zitat:

Ich hab versucht das Programm bei mir zu implementieren. Da gibt es gleich den ersten Fehler. Compiler meint TVocableList ist nicht deklariert. Dabei stehts aber drinne.
Typischer Copy&Paste. Das ist der Beweis, dass du dir den Code vorher nicht ordentlich genug angeguckt hast.

HolgerX 24. Nov 2018 14:35

AW: Elemente aus TStringList in Laufzeit entfernen
 
Hmm..

und wenn Du dir die Units angesehen hättest, dann währe dir die Unit UVocableList aufgefallen, diese enthält die Classendeclarationund die TVocableList.

So ist nicht alles in die Unit der Form geklatscht...

Zitat:

Zitat von p80286 (Beitrag 1419021)
Zitat:

Zitat von HolgerX (Beitrag 1419016)
Hmm..

(Wieso immer mit Records bei Listen gearbeitet wird... ;) )

Einfach und relativ einfach zu verstehen. OK ein Array of Record ist noch simpler, aber nach meiner Erfahrung ist eine TObjectlist/TList effizienter.

Ist aber vielleicht auch der Vorstellung geschuldet, daß ein Object komplexer ist als ein Record?

Gruß
K-H

Wenn ich mir die Records von heute anschaue, ist da auch nicht mehr viel Unterschied zu einer Class..
constructor/functionen und so weiter...

Ich finde Klassen sauberer, da es ein 'create' / Benutzten und definiertes 'Free' gibt..
Bei Records sind diese mit der Variablendeklaration 'einfach' da.. (OK, wenn man nicht gerade mit Pointer auf Record arbeitet)
Und wenn der Scope weg ist, dann sind diese (hoffentlich) auch wieder sauber weg ;)

Durch die Verwendung der ObjectList habe hier in diesem Beispiel nur das Herumkopieren von Array Teilen beim Löschen von Elementen mitten heraus umgangen...
Auch kümmert diese sich sauber um das Löschen der Objecte..

Im Beispiel habe ich dann nur noch das Visuelle in eigene Proceduren ausgelagert, weil ich keine langen Spaghetticode mag.. ;)

EWeiss 24. Nov 2018 15:58

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Das Programm muss nächste Woche fertig werden.
Ich hoffe du schaffst es auch..
Alle Leute die dir bisher geholfen haben sind nicht auf müssen aus und denen ist es egal ob du das in der nächsten Woche fertig haben musst.

Die machen es auf freiwilliger Basis.
Ein müssen seitens der Helfenden Hände hier gibt es nicht!

gruss

DieDolly 24. Nov 2018 17:48

AW: Elemente aus TStringList in Laufzeit entfernen
 
Klare Worte müssen ab und zu auch mal sein.
Klingt vielleicht hart, aber es ist die Wahrheit.

Häng dich rein, dann hast du nächste Woche den technisch wohl besten Vokabeltrainer der ganzen Klasse.

KetchUp 25. Nov 2018 15:47

AW: Elemente aus TStringList in Laufzeit entfernen
 
Ich hab jetzt wirklich viele Stunden versucht @HolgerX QUellcode zu verstehen und auch die Erklärung zu Klassen im Delphi Treff gelesen.

Aber an dem Punkt an dem ich gemerkt habe, dass Klassen auch so was wie Prozeduren sind bin ich ausgestiegen.

Deswegen will ich jetzt noch mal komplett von vorne anfangen und das Ganze mit Records aufbauen. Soweit bin ich mit den Erklärungen vom Delphi Treff gekommen (sieht auch Euren Vorschlägen ähnlich). Wenn ich aber meinem Record VocabularyList.German seine Vokabeln zuordnen will meckert der Compiler: Incompatible types TStringList and string.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TVocabulary = record
    German : TStringList;
    English : TStringList;
    Repetitions : Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  VocabularyList: TVocabulary;
  Vocabulary: TStringList;
  index: Integer;

begin
  Vocabulary.LoadFromFile('Vocabulary.text');

  for index:= 0 to Vocabulary.Count -1 do
  begin
    VocabularyList.Repetitions:= 3;
    VocabularyList.German:= Vocabulary.ValueFromIndex[index];
    VocabularyList.English:= Vocabulary.Names[index];
  end;

end;
Jemand ne Idee warum er das macht?

HolgerX 25. Nov 2018 16:12

AW: Elemente aus TStringList in Laufzeit entfernen
 
Hmm..

Was für ein Kuddelmuddel! ;)

Letzter Versuch meiner seits...

Zitat:

Delphi-Quellcode:
type
  TVocabulary = record
    German : TStringList;
    English : TStringList;
    Repetitions : Integer;
  end;

Bei 'Datenverarbeitung' mit mehren Datensätzen (ob dass nun 2 Wörter hier sind, oder ganze Datensätze mit diversen Feldern) gibt es 'immer' nur 'eine' Liste, welche eine beliebige Anzahl von Datensätzen enthält!

Wenn hier im Thread von Records gesprochen wurde, dann sind diese 'Records' jeweis 'ein' Datensatz in der Liste.
Somit
Delphi-Quellcode:
  TVocabulary = record
    German : String;
    English : String;
    Repetitions : Integer;
  end;
Dies geht übrigens auch als Classe (Object):

Delphi-Quellcode:
  TVocabulary = class
    German : String;
    English : String;
    Repetitions : Integer;
  end;
Egal ob ObjectList oder StringList, dies sind 'Listen' welche Datensätze (Objecte) enthalten.
Alternativ kannst Du auch ein
Delphi-Quellcode:
 TVocabularyList = Array of TVocabulary
verwenden.
Jedoch ist das Löschen von einem Datensatz in diesem Array etwas aufwändiger als bei einer ObjectList.
Denn dann musst Du die verbleibenden Einträge in deinem Array in ein neues, verkleinertes umkopieren und nur den zu löschenden weglassen..

Ich hatte in meinem Beispiel TObjectList verwendet mit Objecten, statt Records, da da die Bearbeitung (löschen) einfach geht.
Hier kümmert sich die TObjectList selber um das Händling..
In meiner Unit habe ich nur die TObjectList leicht geändert/erweitert, um einfacher auf die Objecte zugreifen und hinzufügen zu können.

Ich werde Dir hier nun kein Beispielprogramm mit Arrays vorkauen...

p80286 25. Nov 2018 17:38

AW: Elemente aus TStringList in Laufzeit entfernen
 
:thumb:
Gut erklärt!

Gruß
K-H

DieDolly 25. Nov 2018 18:15

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Aber an dem Punkt an dem ich gemerkt habe, dass Klassen auch so was wie Prozeduren sind bin ich ausgestiegen.
Man könnte es auch so formulieren "An dem Punkt an dem ich gemerkt habe, dass Klassen auch so was wie Prozeduren sind und ich mir das einrede bin ich ausgestiegen und habe den guten Holger-Code weggeschmissen weil ich ihn nicht verstehe"

Zitat:

Aber an dem Punkt an dem ich gemerkt habe, dass Klassen auch so was wie Prozeduren sind bin ich ausgestiegen.

Deswegen will ich jetzt noch mal komplett von vorne anfangen und das Ganze mit Records aufbauen.
Wenn du das denkst, dann hast du etwas ganz und gar nicht verstanden.

Holgers Ansatz war mehr als in Ordnung. Wieso wirfst den einfach weg und fängst schon wieder mit deiner komischen StringListe an? Ließ doch mal was die Leute dir schreiben.

Zitat:

Ich hab jetzt wirklich viele Stunden versucht
Wenn du das viele Stunden getan hättest, würdest du den Code schon lange verstanden haben.

Delphi-Laie 25. Nov 2018 22:09

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Zitat von KetchUp (Beitrag 1418250)
Vermutlich löscht Delphi die Vokabel, nur ohne die verbleibenden neu zu sortieren

Ist auch nicht nötig, weil Elementelöschungen nicht die vorhandene Ordnung / Sortierung zerstören.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.
Seite 3 von 3     123   

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