![]() |
AW: Selbstprogrammierung eines Vokabeltrainers
Zitat:
Delphi-Quellcode:
und
pos()
Delphi-Quellcode:
und ggf.
Copy()
Delphi-Quellcode:
machst Du zu Fuß das, was schon als Funktionalität in
Delete()
Delphi-Quellcode:
steckt.
Tstringlist.DelimitedText
Wenn Du den Fußweg nicht beherschst, bist Du bei einem anderen Compiler/Sprache die den "DelimitedText" nicht bietet verloren. Was CSV angeht ![]() Gruß K-H |
AW: Selbstprogrammierung eines Vokabeltrainers
Für gerade einmal 2 Werte je Datensatz finde ich CSV eher kontraproduktiv. Was habt Ihr eigentlich alle gegen Namens-/Wertepaare? Viel einfacher geht es doch kaum noch.
Delphi-Quellcode:
procedure TFormTest.btnTestClick(Sender: TObject);
var Items: TStrings; //als Ersatz für die Items der Listbox i: integer; AName, AValue: string; begin Items := TStringlist.Create; try //wird ja normalerweise aus der Datei ausgelesen Items.Add('Dings=Bums'); Items.Add('Hau=Ruck'); Items.Add('Blabb=Blubb'); Items.Add('Die Frage nach dem Leben, dem Universum und einfach Allem=42'); for i := 0 to Items.Count - 1 do begin AName := Items.Names[i]; AValue := Items.ValueFromIndex[i]; ShowMessage('Frage: ' + AName + sLineBreak + 'Antwort: ' + AValue); end; finally Items.Free; end; end; |
AW: Selbstprogrammierung eines Vokabeltrainers
Nur um das nochmal aufzugreifen und da ich vermute, das der TE als Anfänger evtl. Verständnisschwierigkeiten hat und evtl. in der Schule andere Begrifflichkeiten verwendet werden:
a) In Klassen nennt man was sonst so unter dem Namen Variablen läuft auch Felder, genauso wie man Prozeduren/Funktionen dort Methoden nennt. "Private" Felder heißt dann in dem Zusammenhang noch, dass diese Felder/Variablen nur innerhalb der Klasse sichtbar sind, d.h. benutzt werden können. Wie das im Code aussieht hat DeddyH ja schon gezeigt. b) Und als Ergänzung zu #12 von DeddyH, bzw. allgemein, ist es vllt. auch hilfreich zu zeigen, wie der Inhalt der Textdatei dann aussehen könnte:
Code:
bzw. auf die Aufgabe bezogen
Dings=Bums
Hau=Ruck Blabb=Blubb Die Frage nach dem Leben, dem Universum und einfach Allem=42
Code:
1714=Kartoffelkrieg
1896=1. olymp. Spiele der Neuzeit 2014=Deutschland wird Fußballweltmeister usw. |
AW: Selbstprogrammierung eines Vokabeltrainers
Dazu habe ich allerdings in meinem ersten Post die Doku verlinkt, ein wenig eigene Recherche sollte schon sein ;)
|
AW: Selbstprogrammierung eines Vokabeltrainers
Zitat:
Um gänzlich unabhängig zu sein empfiehlt es sich auf folgende Struktur zu gehen:
Code:
Der Fragenkatalog kann dann einfach in eine StringListe geladen werden (ist und bleibt ja eine Textdatei) und das Frage-Antwort-Paar kann dann so ausgelesen werden:
<Frage>;<Antwort>
Delphi-Quellcode:
type
TItem = record Question : string; Answer : string; end; function StrToItem( const AStr : string ) : TItem; var LRow : TStringList; begin LRow := TStringList.Create; try LRow.Delimiter := ';'; // LRow.StrictDelimiter := True; // erst ab Delphi xxx LRow.DelimitedText := AStr; // Diese Prüfung kann man auch weglassen, es knallt sowieso :) if LRow.Count < 2 then raise Exception.CreateFmt( 'Ungültiges Format für Frage-Antwort <%s>', [AStr] ); Result.Question := LRow[0]; Result.Answer := LRow[1]; finally LRow.Free; end; end; function GetItem( ACatalog : TStrings; Index : Integer ) : TItem; begin Result := StrToItem( ACatalog[Index] ); end; |
AW: Selbstprogrammierung eines Vokabeltrainers
Entschuldigt meine kürzliche Inaktivität.
Zitat:
Ich hab mich mal dran versucht mit Pos und Copy zu arbeiten, komme allerdings nicht wirklich weiter; Delphi zeigt Fehler an, wo ich weiß, dass es falsch ist, ich aber auf keinen grünen Zweig komme... /:
Delphi-Quellcode:
Es scheitert bei mir an der Verwendung von Pos und Copy. Ich weiß, wozu man sie benutzt, aber WIE ist mir in diesem Fall unklar. Ich weiß, dass sich in dem Quelltextausschnitt Fehler verstecken und wenn ihr einen findet, würde ich mich freuen, wenn ihr ihn mir nennen würdet.
private
{ Private-Deklarationen } FJahr:string; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} var Jahreszahl:Integer; Datei: file of byte; procedure Trennung(text:String); var Jahr,Ereignis,Gesucht:String; begin AssignFile(Datei,'TextEreignis.txt'); Reset(Datei); while not eof(Datei) do begin Readln(Datei,Gesucht); if pos(';',Datei) > 0 then copy (Datei,5,20); ... jahr:= ereignis:= end; D.h. ich bräuchte jetzt nochmal einen Anstoß für die richtige Verwendung von Pos und Copy... @ Sir Rufo; Wenn ich mit TString arbeiten würde, wo würde ich denn dann in deinem Quelltext den Zugriff auf meine Textdatei unterbringen? Danke! :) |
AW: Selbstprogrammierung eines Vokabeltrainers
Delphi-Quellcode:
const
FRAGE_ANTWORT = 'Die Frage nach dem Leben, dem Universum und einfach Allem;42'; TRENNER = ';'; var iPos: integer; Frage, Antwort: string; begin (* Position des Trennzeichens ermitteln *) iPos := Pos(TRENNER, FRAGE_ANTWORT); (* Wenn gefunden *) if iPos > 0 then begin (* Von Stringanfang bis ausschließlich Trennzeichen kopieren *) Frage := Copy(FRAGE_ANTWORT, 1, iPos - 1); (* Nun alles hinter dem Trennzeichen *) Antwort := Copy(FRAGE_ANTWORT, iPos + 1); ShowMessage('Frage: ' + Frage + sLineBreak + 'Antwort: ' + Antwort); end; end; |
AW: Selbstprogrammierung eines Vokabeltrainers
Müsste ich dann für jeden Frage-Antwort Paar so etwas deklarieren?
Oder gibt es einen einfacheren Weg? |
AW: Selbstprogrammierung eines Vokabeltrainers
Noch einfacher? Mach aus dem Beispiel eine Funktion oder Prozedur, die kannst Du dann je Zeile abarbeiten. Oder schau Dir mein Beispiel von oben mit den TStrings noch einmal an, das Add() entfällt dabei, da Du die Liste ja dann aus einer Datei befüllst.
|
AW: Selbstprogrammierung eines Vokabeltrainers
Ich hatte ja schon die procedure Trennung erstellt mit der ich eigentlich arbeiten wollte.
Wenn ich also Zeile für Zeile abarbeiten will, muss ich also immer das, entsprechend der Frage und Antwort, wiederholen?
Delphi-Quellcode:
begin
(* Position des Trennzeichens ermitteln *) iPos := Pos(TRENNER, FRAGE_ANTWORT); (* Wenn gefunden *) if iPos > 0 then begin (* Von Stringanfang bis ausschließlich Trennzeichen kopieren *) Frage := Copy(FRAGE_ANTWORT, 1, iPos - 1); (* Nun alles hinter dem Trennzeichen *) Antwort := Copy(FRAGE_ANTWORT, iPos + 1); ShowMessage('Frage: ' + Frage + sLineBreak + 'Antwort: ' + Antwort); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 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 by Thomas Breitkreuz