Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi String ausgeben (https://www.delphipraxis.net/182088-string-ausgeben.html)

DelphiDan 29. Sep 2014 18:57

String ausgeben
 
Hallo Leute,

ich bin noch ein "Anfänger" in Delphi und komme gerade nicht wirklich weiter, weil ich den Fehler in einer Procedure nicht findet.

Ich versuche ein einfachen Vokabeltrainer zu erstellen.
Man kann jeweils 12 Wörter eintragen (pro Sprache) und diese sollen dann auf einem extra Panel in 2 Edit Felder abgefragt werden.
Nun ist mein erstes Problem, dass nach dem man auf den Button "Start" klickt, keine Wörter auf den Editorfelder ausgeben werden.

Die gesamte Procedure lautet:

Delphi-Quellcode:
var d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12:string;
    zufalldeutsch,zufallenglisch:integer;

procedure TForm1.ButtonstartClick(Sender: TObject);
begin

    if deutsch1.text='' then
    begin
    showmessage('Bitte alle Felder ausfüllen');
    exit;
    end;
    if deutsch2.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen');
    exit;
    end;
    if deutsch3.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen');
    exit;
    end;
    if deutsch4.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen');
    exit;
    end;
    if deutsch5.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen');
    exit;
    end;
    if deutsch6.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if deutsch7.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
     end;
    if deutsch8.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if deutsch9.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if deutsch10.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
   end;
    if deutsch11.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
     exit;
    end;
    if deutsch12.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if englisch1.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
     exit;
    end;
    if englisch2.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if englisch3.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if englisch4.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
     exit;
    end;
    if englisch5.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if englisch6.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
     exit;
    end;
    if englisch7.text='' then
     begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if englisch8.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if englisch9.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if englisch10.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if englisch11.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;
    if englisch12.text='' then
    begin
    showmessage('Fehler'+'Bitte alle Felder ausfüllen') ;
    exit;
    end;

    panel1.visible:=true;

    d1:=deutsch1.text;
    d2:=deutsch2.text;
    d3:=deutsch3.text;
    d4:=deutsch4.text;
    d5:=deutsch5.text;
    d6:=deutsch6.text;
    d7:=deutsch7.text;
    d8:=deutsch8.text;
    d9:=deutsch9.text;
    d10:=deutsch10.text;
    d11:=deutsch11.text;
    d12:=deutsch12.text;
    e1:=englisch1.text;
    e2:=englisch2.text;
    e3:=englisch3.text;
    e4:=englisch4.text;
    e5:=englisch5.text;
    e6:=englisch6.text;
    e7:=englisch7.text;
    e8:=englisch8.text;
    e9:=englisch9.text;
    e10:=englisch10.text;
    e11:=englisch11.text;
    e12:=englisch12.text;

    zufalldeutsch:=random(1-12);

    If zufalldeutsch=1 then
    begin
    editdeutsch.text:=d1;
    editenglisch.text:=e1;
    end else
    If zufalldeutsch=2 then
    begin
    editdeutsch.text:=d2;
    editenglisch.text:=e2;
    end else
    If zufalldeutsch=3 then
    begin
    editdeutsch.text:=d3;
    editenglisch.text:=e3;
    end else
    If zufalldeutsch=4 then
    begin
    editdeutsch.text:=d4;
    editenglisch.text:=e4;
    end else
    If zufalldeutsch=5 then
    begin
    editdeutsch.text:=d5;
    editenglisch.text:=e5;
    end else
    If zufalldeutsch=6 then
    begin
    editdeutsch.text:=d6;
    editenglisch.text:=e6;
    end else
    If zufalldeutsch=7 then
    begin
    editdeutsch.text:=d7;
    editenglisch.text:=e7;
    end else
    If zufalldeutsch=8 then
    begin
    editdeutsch.text:=d8;
    editenglisch.text:=e8;
    end else
    If zufalldeutsch=9 then
    begin
    editdeutsch.text:=d9;
    editenglisch.text:=e9;
    end else
    If zufalldeutsch=10 then
    begin
    editdeutsch.text:=d10;
    editenglisch.text:=e10;
    end else
    If zufalldeutsch=11 then
    begin
    editdeutsch.text:=d11;
    editenglisch.text:=e11;
    end else
    If zufalldeutsch=12 then
    begin
    editdeutsch.text:=d12;
    editenglisch.text:=e12;
    end;
Kann mir jemand helfen?
Danke!

Helmi 29. Sep 2014 19:07

AW: String ausgeben
 
überleg dir bitte, was dabei rauskommen soll:
Delphi-Quellcode:
zufalldeutsch:=random(1-12);
wohl eher
Delphi-Quellcode:
zufalldeutsch:=random(12);
(wenn ich mich nicht täusche)

Luckie 29. Sep 2014 20:13

AW: String ausgeben
 
Aber wenn ich die Variablen sehe, schreit das gerade zu nach einem Array oder Liste.

Helmi 29. Sep 2014 20:19

AW: String ausgeben
 
Zitat:

Zitat von Luckie (Beitrag 1274257)
Aber wenn ich die Variablen sehe, schreit das gerade zu nach einem Array oder Liste.

ich denke das ist der zweite Schritt den er machen soll
erst mal soll sein vorhandenes funktionieren - danach kann man optimieren (lernen)

p80286 29. Sep 2014 20:41

AW: String ausgeben
 
Gegenfrage: wird
Delphi-Quellcode:
showmessage
ausgeführt?

und sieh Dir mal
Delphi-Quellcode:
case
an.

Gruß
K-H

himitsu 29. Sep 2014 22:23

AW: String ausgeben
 
Und warum liegen alle Variablen global rum und sind nicht lokal in der Methode deklariert?

Den Sinn der d- und e-Variablen kann ich auch nicht erkennen.
Delphi-Quellcode:
    If zufalldeutsch=1 then
    begin
    editdeutsch.text:=deutsch1;
    editenglisch.text:=englisch1;
    end else
    If zufalldeutsch=2 then
Das mit den Arrays wurde schon gesagt
und für die Edits gibt es FindComponent. (was auch das vorgeschlagene CASE überflüssig machen würde)

Und die (fehlende) Codevormatierung ist eher als grausam zu bezeichnen.

BUG 29. Sep 2014 22:48

AW: String ausgeben
 
Zitat:

Zitat von Helmi (Beitrag 1274249)
wohl eher
Delphi-Quellcode:
zufalldeutsch:=random(12);
(wenn ich mich nicht täusche)

Du täuschst dich: für die Zahlen zwischen 1 und 12 fällt noch ein +1 :mrgreen:
Delphi-Quellcode:
// Random(n) gibt eine Zahl zwischen 0 und n-1 zurück
zufalldeutsch:=random(12) + 1;

@DelphiDan: Das Textfeld bleibt leer, weil keiner deiner Bedingungen in deinem if-then-else "Monster" zutrifft.

Puke 29. Sep 2014 22:59

AW: String ausgeben
 
Ich glaub da war was:
Zitat:

Zitat von DelphiDan (Beitrag 1274246)
ich bin noch ein "Anfänger" in Delphi

Ach, er ist noch Anfänger. Und warum reiten dann alle (bis auf BUG und p80286) auf ihm rum?

DelphiDan, versuch erstmal den ersten Teil mit einer oder-Verknüpfung zu minimieren (Du musst es noch nicht mit FindComponent machen):
Delphi-Quellcode:
if (deutsch1.text = '') or (deutsch2.text = '') or ... or (englisch11.text = '') or (englisch12.text = '') then
   ShowMessgae('...')
else
begin
  // Hier kommt der Teil ab dem "panel1.visible := false" rein
  panel1.visible := false;
  {...}
end;
Und dann kannst du weitermachen mit der
Delphi-Quellcode:
case
-Anweisung
Delphi-Quellcode:
case zufallszahl of
 1: begin
       // Hier kommt die Zuweisung dann rein
       editdeutsch.text:=d1;
       editenglisch.text:=e1;
    end;
 2: begin
       // Hier kommt die Zuweisung dann rein
    end;
 {...}
end;
Das wird übersichtlicher und einfacher für dich.

Beste Grüße
Puke

BUG 30. Sep 2014 03:08

AW: String ausgeben
 
Zitat:

Zitat von Puke
Und warum reiten dann alle (...) auf ihm rum

Die Kommentare zeigen die nächsten Schritte auf, die DelphiDan mit dem Code gehen sollte.
  • bessere Einrückung
  • die Wiederholungen vermeiden (Array und Schleifen)
  • dann eventuell die globalen Variablen
Delphi-Quellcode:
case
wäre zwar eine schönere Krücke, aber erst mit Schleifen bekommt man ein Großteil der Wiederholungen erschlagen.

Es ist halt wirklich "Anfängercode", aber das ist OK für einen Anfänger ... nur möchte man sich eben auch weiterentwickeln und die Kritik in der DP ist dafür aus meiner Erfahrung ein günstiges Mittel. Im Prinzip schreibt jeder mal "gruseligen" Code; die entscheidende Fähigkeit ist es zu erkennen, dass und warum er "gruselig" ist. Es hilft, wenn man es oft genug gesagt bekommt.

Reviewed (~kritisiert) wird der Code, nicht der Programmierer.
In dem Sinne: nicht abschrecken lassen von den Alt-Eingesessenen, wir wollen nur dein Bestes :wink:

Namenloser 30. Sep 2014 04:32

AW: String ausgeben
 
Es hat aber auch keinen Sinn, einen Anfänger, der mit einer konkreten Frage ankommt, mit einer Flut an Informationen zu erschlagen, die mit seinem Problem nicht direkt etwas zu tun haben. Eins nach dem anderen... Erst mal den eigenen Ansatz zum Laufen bringen, danach kann man ggf. schauen, ob/wie es besser geht. Genau wie es in Mathe oder anderen Fächern ja auch am effektivsten ist, erst mal eine Aufgabe selbstständig zu bearbeiten und anschließend mit der Musterlösung zu vergleichen, statt gleich in die Musterlösung zu schauen.

Ist doch normal, dass man so anfängt. Meine ersten Programme sahen genau so aus.

himitsu 30. Sep 2014 05:04

AW: String ausgeben
 
Zitat:

Zitat von BUG (Beitrag 1274276)
Reviewed (~kritisiert) wird der Code, nicht der Programmierer.
In dem Sinne: nicht abschrecken lassen von den Alt-Eingesessenen, wir wollen nur dein Bestes :wink:

Und ein Teil der "Kritik"/Fragen geht auch manchmal am Schüler vorbei eher an den Lehrer. :stupid:

Also wenn es da einen gibt, dann die Erklärungen/Fragen auch bitte mal an Diesen weitergeben.

Medium 30. Sep 2014 09:45

AW: String ausgeben
 
Och Leute. Wenn doch klar von vorne herein angesagt ist, dass hier gerade erst begonnen wird - sehr wahrscheinlich nicht nur mit Delphi, sondern mit Programmieren allgemein - dann liegt schon mal nahe, dass hier die Schule der Aufgabensteller ist. Wenn wir jetzt daher kommen und (durchaus gut gemeinte) Vorschläge machen, wie man alles viel einfacher, besser, schöner und schneller machen könnte, dann verwirrt man nicht nur den TE gewaltig (ich zumindest wäre es), sondern bringt u.U. den Plan des Lehrers völlig durcheinander.

Ja, viele Lehrer an Schulen bringen fragwürdige Dinge bei, aber es ist der, der hier nachher die Noten gibt. Und was könnte jemanden dazu motivieren mit Softwareentwicklung weiter zu machen? Riiiichtig. Gute Noten können da schon mal helfen. Selbst wenn wir es schaffen dem TE die Superdupermusterlösung mit Profisiegel verständlich ans Herz zu legen, wird der Lehrer vermutlich nur eines sagen: An der Aufgabe vorbei, 6. (Leider ist nicht selten auch zu erwarten, dass Lehrer gewisse Konstrukte und Vorgehensweisen nichtmals als solche erkennen.)

Bevor wir hier also anfangen den Code zur Unkenntlichkeit zu refactorn, lasst uns doch lieber mal versuchen hier jemanden NICHT mit überladener (Semi-)Profimentalität zu verschrecken. So sehen Programme am Anfang nun mal aus. Meine auch. Trotzdem ist aus mir was geworden, auch ohne dass mir jemand auf Nachfragen den halben Fachbegriffekatalog der Informatik an die Stirn geklatscht hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 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