Autor Beitrag
Througer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Di 21.03.06 18:15 
Hallo,

ich habe ein Problem bei der Programmierung eines Programms das wie "Wer wird Millinär aufgebaut ist. Habe mir schon die anderen Threads dazu durchgelesen, konnte aber keine passende Antwort finden.

Meine Frage ist nun:

Ich habe verschiedene Fragen und Antworten hinterlegt. Diese Fragen sollen aber nach folgendem Schema angelegt werden:

Wer war Helmut Kohl§russischer Präsident§Kaiser von China§deutscher Bundeskanzler$Wurstfabrikant§

Nun soll das Programm Buchstabe für Buchstabe übertragen.
Das heißt, der Anfang ist immer die Frage und wird in ein Panel ubertragen. Dann kommen die Antworten und werden in verschiedene Buttons übertragen. Dabei werden die Buchstaben überprüft und wenn § kommt ist es eine falsche Antwort und wenn ein Dollarzeichen kommt ist es die richtige Antwort.

Wie mache ich es, dass das Programm zeichen für zeichen überträgt.
Hoffe ich habe das einigermaßen versändlich erklärt. Wenn nicht, dann bitte noch einmal nachfragen.

Für Antworten und Hilfe bin ich euch dankbar.


MfG Througer:
Constan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 80

Win XP, Suse 10.1
Delphi 7
BeitragVerfasst: Di 21.03.06 18:20 
geht das nich auch mit einer ini datei?

[Wer war Helmut Kohl]
russischer Präsident=ja
Kaiser von China=nein
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: Di 21.03.06 18:22 
Um den String richtig aufzusplitten kannst du die Funktionen Copy und Pos benutzen. Unit StrUtils muss eingebunden werden.

_________________
Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
Danniolo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 693



BeitragVerfasst: Di 21.03.06 18:23 
Falls du's nicht mit Inis oder XML Dateien machen willst guck dir ma das hier an
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Di 21.03.06 18:55 
user profile iconConstan hat folgendes geschrieben:
geht das nich auch mit einer ini datei?

[Wer war Helmut Kohl]
russischer Präsident=ja
Kaiser von China=nein

Das würd ich aber anders machen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
[Frage1]
frage=Wer war Helmut Kohl?
antwort=3
antwort1=Präsident
antwort2=Kaiser
antwort3=Bundeskanzler
antwort4=Wurstfabrikant

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Constan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 80

Win XP, Suse 10.1
Delphi 7
BeitragVerfasst: Di 21.03.06 19:42 
stimmt :oops:

wollte ja nur ein bespiel bringen aber so wie gta-place würde ich es machen ist einfacher und übersichtlicher, finde ich.
Througer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Di 21.03.06 20:41 
Erstmal danke für eure Antworten.
Der Link von Danniolo trifft es aber am ehesten.

Das Problem bestand ja nicht darin zu Erkennen welches die richtige Antwort ist, solder die Wörter bzw. Antworten nach dem jeweiligen Zeichen zu trennen.
Dass heißt, dass die Frage in ein Panel kommt un nach jedem zeichen das nächste Wort auf einen Button gelegt wird. Mir fehlten die Befehle zum Trennen nach den Zeichen.

Also nach dem Motto:
Panel1.caption:= Text bis "§" kommt.
Dann "Text nach §" := Button1.caption bis § wieder kommt.

Hab das jetzt einfach mal ganz simpel geschrieben. Man könnte anders sagen, wenn viele Wörter hintereinander geschrieben sind, dann soll jedes neue Wort einzeln hingeschrieben werden. Das Dollarzeichen oder § soll nur der Punnkt sein wo getrennt werden soll.


Noch mal danke an alle. Werde das jetzt erstmal mit den neune Infos versuchen und sage euch dann auch ob das funktioniert hat.

Thx Througer:
blaueled
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 133

Win XP
D5
BeitragVerfasst: Di 21.03.06 21:11 
Hallo,

ich würde die Antworten nicht starr speichern, da man bei zu wenig Fragen leicht zu merkende
Abläufe hat. Also eher so speichern, dass das erste immer die richtige Antwort ist, und das Programm
die Fragen dann verteilt.

inis würde ich nicht nehmen, da sie nur bis 64kb groß werden dürfen.

Arne
Througer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 25.03.06 19:03 
Hallo, konnte erst heute ausprobieren wie das so alles funktioniert.

@blaueled hast schon recht. Die Antworten sind dann einfach zu merken. Aber erstmal klein Anfangen. Dann kann man ja noch später gucken wie man das macht.

Also, habe jetzt schon einen kleinen Teil erreicht. Das ganze geht jetzt so, bzw. soll so gehen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
C:=1  //Anfangswert für Fragenzähler
d:='' // Merker für die richtige Antwort der jeweiligen Frage
a:=listbox1.items.count // Anzahl der vorhandenen Fragen
b:=Random(a) //per Zufalll Fragen auswählen
frage:=listbox1.items[b]; // der Variablen Frage wird die Zeichenkette der entsprechenden Frag zugeordnet
e:=frage[c]; //s.o. wird gebraucht, um die Zeichenkette nach dem § oder $ zu zerlegen


so, dann soll auf das Frage Panel die entsprechende Frage //Buchstabe für Buchstabe bis § erreicht ist geschrieben werden. Hier kann nur § sein, da am Ende de Frage nur dieses Zeichen steht.
ehöhe c um 1
weise e den Rest der Fragenzeichenkette zu bis e = §

schreibe auf Button_A die erste Antwort
erhöhe c
weise e den Rest der Fragezeichenkette zu bis e = § oder e = $
wenn e = $ merke dir A für die richtige Antwort
erhöhe c um 1
weise e den Rest der Fragezeichenkette zu

das wiederholt sich bis alle 4 Antworten vergeben sind.

Mein Problem ist jetzt e den Rest zuzuweisen.

Ich habe schon folgendes:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button8Click(Sender: TObject);
var
Pos: integer;               //pox=position
Aus,text: string;           //Aus=Ausgabe

begin
pos:=0;

repeat
Pos:=Pos+1;                             //Position um 1 erhöhen
aus:=copy(Frage,Pos,1);                 //Zeichen kopieren
If aus <> '§' then text:=text+aus;     // Zeichen 'text' zuordnen
panel2.caption:=text;                  //Text ausgeben
until (aus = '§');                    // Ende wenn Zeichen errreicht

Wie erreiche ich es nun das e den Rest bekommt, bzw. ist meine Denkweise richtig.

Danke euch jetzt schon für eure Hilfe, denn hier bekommt man immer sehr schnell sehr gute Lösungsvorschläge oder zumindest Punkte die einem weiterhelfen.
Habe für diese Lösung die Stichpunkte von Marco D. nachgeschlagen

Thx Througer:

PS: Kann mir einer sagen wie man es macht, dass es so aussieht wie der Quellcode von Delphi wenn man ihn ins Forum koppiert??

Moderiert von user profile iconGausi: Beitragsformatierung überarbeitet.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 25.03.06 19:30 
unter [bereiche] drücken ... dann bereiche: Delphi ---- am ende dann noch mit dem [+] abschliessen. kannst dann in der vorschau prüfen.
Througer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: So 26.03.06 14:36 
Habe noch ein Teil hinzugefügt.

Nun habe ich ja die Frage, die wie folgt aussieht;

Frage:='Wer war Helmut Kohl?§russischer Präsident§Bundeskanzler$';

Dies frage ordne ich nun e zu;

e:=Frage[c];

Nun kommt meine Abfrage:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button8Click(Sender: TObject);
var
Pos,L1,L: integer;               //pos=position
Aus,text: string;                //Aus=Ausgabe

begin
pos:=0;
repeat
Pos:=Pos+1;                              //Position um 1 erhöhen
aus:=copy(e,Pos,1);                      //Zeichen kopieren
If aus <> '§' then text:=text+aus;       // Zeichen 'text' zuordnen
panel2.caption:=text;                    //Text ausgeben
until (aus = '§')                        // Ende wenn Zeichen errreicht
or (aus = '$');

Nach dem das geschehen ist steht in meinem Panel auch "Wer war Helmut Kohl?"
Nun soll e der Rest der Zeichenkette zugeordnet werden.
Dies versuche ich so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
L1:=Length(e);
If pos = L1 then exit;

L:=Length(Text);
Delete(e,1,L+1);

Schreibe ich nun noch darunter als Bsp.;
ausblenden Delphi-Quelltext
1:
Button4.caption:=e;					

Dann steht da auch "russischer Präsident§Bundeskanzler$"
Das heist doch das e auch der Rest zugewiesen wurde oder?
Doch schreibe ich nun die Auswahl erneut und ersetzte das Label2.caption durch Button5.caption, so steht in diesem Button:

"Wer war Helmut Kohl?Bundeskanzler"

Das russicher Präsident wird einfach weggelassen.
Alles was ich jetzt geschrieben habe steht in einer Procedure
Es sieht nun so aus;
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure TForm1.Button8Click(Sender: TObject);
var
Pos,L1,L: integer;               //pos=position
Aus,text: string;           //Aus=Ausgabe

begin
pos:=0;
repeat
Pos:=Pos+1;                              //Position um 1 erhöhen
aus:=copy(e,Pos,1);                  //Zeichen kopieren
If aus <> '§' then text:=text+aus;       // Zeichen 'text' zuordnen
panel2.caption:=text;                    //Text ausgeben
until (aus = '§')                      // Ende wenn Zeichen errreicht
or (aus = '$');

L1:=Length(e);
If pos = L1 then exit;

L:=Length(Text);
Delete(e,1,L+1);

repeat
Pos:=Pos+1;                              //Position um 1 erhöhen
aus:=copy(e,Pos,1);                  //Zeichen kopieren
If aus <> '§' then text:=text+aus;       // Zeichen 'text' zuordnen
Button5.caption:=text;                    //Text ausgeben
until (aus = '§')                      // Ende wenn Zeichen errreicht
or (aus = '$');

end;

Ich habe allerdings bemerkt, das wenn ich die zweite repeat-Schleife weg lasse und erneut den Button drücke, dass dann in dem Panel der zweite Abschnitt geschrieben wird. Also erst steht da: "Wer war Helmut Kohl?" und dann "russischer Präsident".

Gibt es eine Möglichkeit, dass das Ergebniss von dem zweiten durchlauf nicht mehr ins Panel geschrieben wird sonder in einen Button? Oder irgendwelche anderen Lösungvorschläge?

Wäre nett wenn mir mal einer ein Bsp. zeigen könnt.

MfG Througer:


Edit:

Habe als Dateien mal das Schema angehängt wie es ablaufen sollte. Vielleicht erklärt das einiges. Bin mit der Repeat-Schleife ganz zufriden, denn dann wird es ja auch ruchtig ausgegeben. Auch wenn ich den Button erneut drücke wird der richtige nächste Teil ausgegeben. Nur nicht da wo es soll und auch nicht ganz so wie beschrieben.

Hoffe das mir da einer helfe kann. Komme da echt nicht mehr weiter.
Einloggen, um Attachments anzusehen!
Througer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: So 26.03.06 20:59 
Habe es nun geschafft die Frage mit ihren Antworten auf die versheidenen Buttons zu verteilen, aber jetzt habe ich ein neues Problem. Das ganze sieht nun so aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
procedure TForm1.Button8Click(Sender: TObject);
var
Pos,L1,L: integer;               //pos=position
Aus,text,text2,text3,text4,text5: string;           //Aus=Ausgabe

begin
  //Panel
pos:=0;
repeat
Pos:=Pos+1;                              //Position um 1 erhöhen
aus:=copy(e,Pos,1);                  //Zeichen kopieren
If aus <> '§' then text:=text+aus;       // Zeichen 'text' zuordnen
panel2.caption:=text;                    //Text ausgeben
until (aus = '$')                      // Ende wenn Zeichen errreicht
or (aus = '§');

L1:=Length(e);
If pos = L1 then exit;

Delete(e,0,L+1);
      //Button4
repeat
Pos:=Pos+1;                              //Position um 1 erhöhen
aus:=copy(e,Pos,1);                  //Zeichen kopieren
If aus <> '§' then text2:=text2+aus;       // Zeichen 'text' zuordnen
Button4.caption:=text2;                    //Text ausgeben
until (aus = '$')                      // Ende wenn Zeichen errreicht
or (aus = '§');

L1:=Length(e);
If pos = L1 then exit;

Delete(e,0,L+1);
        //Button5


Es wird ja jetzt immer verglichen ob aus <> '§' ist. und gestoppt wenn aus ='§' oder ='$' ist.
Ist nun aber ein $ Zeichen vorhanden, dann stoppt er dort zwar übernimmt ex aber noch.
Er müsste nun den text mit § und $ vergleichen.
Quasie so:

ausblenden Delphi-Quelltext
1:
If aus <> '§' or aus <> '$' then text2:=text2+aus;					


Allerdungs ist dies nicht möglich. Wie bekomme ich ihn nun dazu den Text mit beiden Zeichen zu vergleichen??

Thx Througer:
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: So 26.03.06 21:27 
du musst bei mehrfachen vergleichen klammern setzen:
ausblenden Delphi-Quelltext
1:
If (aus <> '§') or (aus <> '$') then text2 := text2 + aus;					


mfg ;)