Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Selbstprogrammierung eines Vokabeltrainers (https://www.delphipraxis.net/180545-selbstprogrammierung-eines-vokabeltrainers.html)

p80286 28. Mai 2014 14:11

AW: Selbstprogrammierung eines Vokabeltrainers
 
Zitat:

Zitat von Soph6297 (Beitrag 1260607)
Also hätte ich jetzt die Möglichkeit entweder mit pos und copy zu arbeiten oder mit einer CSV-Datei (von der ich leider noch nie etwas gehört habe)? Ebenso wenig habe ich Erfahrung mit TString aus.
Lässt es sich denn empfehlen mit Pos und Copy zu arbeiten?

Falsche Fragestellung. Mit
Delphi-Quellcode:
pos()
und
Delphi-Quellcode:
Copy()
und ggf.
Delphi-Quellcode:
Delete()
machst Du zu Fuß das, was schon als Funktionalität in
Delphi-Quellcode:
Tstringlist.DelimitedText
steckt.
Wenn Du den Fußweg nicht beherschst, bist Du bei einem anderen Compiler/Sprache die den "DelimitedText" nicht bietet verloren.

Was CSV angeht hier gibt's einen Einstieg.

Gruß
K-H

DeddyH 28. Mai 2014 14:28

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;

Jumpy 28. Mai 2014 15:07

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:
Dings=Bums
Hau=Ruck
Blabb=Blubb
Die Frage nach dem Leben, dem Universum und einfach Allem=42
bzw. auf die Aufgabe bezogen

Code:
1714=Kartoffelkrieg
1896=1. olymp. Spiele der Neuzeit
2014=Deutschland wird Fußballweltmeister
usw.

DeddyH 28. Mai 2014 15:09

AW: Selbstprogrammierung eines Vokabeltrainers
 
Dazu habe ich allerdings in meinem ersten Post die Doku verlinkt, ein wenig eigene Recherche sollte schon sein ;)

Sir Rufo 28. Mai 2014 15:20

AW: Selbstprogrammierung eines Vokabeltrainers
 
Zitat:

Zitat von Jumpy (Beitrag 1260626)
bzw. auf die Aufgabe bezogen
Code:
1714=Kartoffelkrieg
1896=1. olymp. Spiele der Neuzeit
2014=Deutschland wird Fußballweltmeister
usw.

Das wäre aber für die Namens-/Werte-Paare suboptimal, denn jetzt kannst du pro Jahreszahl eine Frage stellen :)

Um gänzlich unabhängig zu sein empfiehlt es sich auf folgende Struktur zu gehen:
Code:
<Frage>;<Antwort>
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:
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;

Soph6297 13. Jun 2014 12:49

AW: Selbstprogrammierung eines Vokabeltrainers
 
Entschuldigt meine kürzliche Inaktivität.

Zitat:

Zitat von Dejan Vu (Beitrag 1260539)
Er liest eine Textdatei in eine Listbox ein. Wo ist da das Problem? Die Vorgabe war 'Textdatei oder typisierte Datei'.

Textdateien sind bei einfachen Sachen vorzuziehen, das man sie mit jedem Notepad-Derivat bearbeiten kann.

In deiner Textdatei muss neben dem Text, der das geschichtliche Ereignis beschreibt, auch die Jahreszahl stehen.
Damit das Programm die beiden Werte voneinander unterscheiden kann, sollte man sie markieren, z.B. mit einem Trennzeichen: "1939;Beginn des 2.Weltkrieges"

Damit kannst Du die Daten aber nicht einfach so ins Ereignispanel schreiben, sondern musst vorher Jahr von Ereignis trennen,

Delphi-Quellcode:
// Statt
// EreignisPanel.Caption:=ListBox1.Items.Strings[Zufall];
  TrenneJahrUndEreignis (ListBox1.Items.Strings[Zufall], FJahr, Ereignis);
  EreignisPanel.Caption := Ereignis;
...
'Ereignis' ist eine lokale String-Variable (die musst Du deklarieren, weißt Du, wo?)
'FJahr' ist ein privates Feld. Weißt Du auch, wo du das deklarieren musst?

Im OnClick des OK-Buttons vergleichst Du nun die Jahreszahleinfabe mit dem Feld 'FJahr' und gibst eine entsprechende Meldung aus.

Ach, trennen musst Du ja noch:
Delphi-Quellcode:
Procedure TForm1,TrenneJahrUndEreignis (text : String; Var jahr, ereignis : string);
Begin
  ...
  jahr := ...
  ereignis := ...
End;
Hier wird dir 'Pos' und 'Copy' weiterhelfen, und die Tatsache, das z.B. das Semikolon Jahr und Ereignis trennt.

Mehr Hilfe gibt es aber nicht :-)

Um nochmal darauf zurückzukommen - ich habe versucht mich mit all den gegebenen Möglichkeiten vertraut zu machen, finde aber, dass ich mit dieser Variante am besten klar kommen werde, da wir es z.T. auch schon behandelt haben.
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:
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;
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.
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! :)

DeddyH 13. Jun 2014 12:57

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;

Soph6297 13. Jun 2014 13:09

AW: Selbstprogrammierung eines Vokabeltrainers
 
Müsste ich dann für jeden Frage-Antwort Paar so etwas deklarieren?
Oder gibt es einen einfacheren Weg?

DeddyH 13. Jun 2014 13:12

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.

Soph6297 13. Jun 2014 13:16

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 00:03 Uhr.
Seite 2 von 4     12 34      

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