Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Label-Feld prüfen


gfckiller - Sa 13.11.10 18:40
Titel: Label-Feld prüfen
Hallo alle miteinander,

ich bin neu im Forum und freu mich, dass ich gleich etwas gefunden habe.

Ich beschäftige mich seit einiger Zeit mit Delphi (das letzte mal Aktiv in der Schule) und wollte nun nach einiger Zeit mal wieder etwas ausprobieren. Leider schwieriger als ich gedacht habe, weshalb ich mich jetzt an euch wende. :)

Kurz warom es geht:
Ich habe ein Spiel bei dem der Gegner Einheiten hat und ich auf diese Einheiten mit verschienen Einheiten reagieren kann.
Beispielsweise hat der Gegner Soldaten also gibt es für mich die Möglichkeit, mit Soldaten, Panzern, ....ect. anzugreifen.

Nun das Problem...

Ich hab eine Checkbox Soldat. Wenn ich die Anklicke soll in eines der 24 Labelfelder als Reaktion stehen: Soldaten, im nächsten Panzer mit der Bedingung , und jetzt da seigentliche Problem, wenn im ersten Labelfeld schon etwas steht, soll er es prüfen und die nächste Einheit in das 2. Labelfeld schreiben, wenn dieses voll ist in das 3. usw...

Ich habe mal Bilder hochgeladen und den bisherigen Quellcode:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if Checkbox1.State=cbChecked then
    if label3.Caption='' then label3.caption:='Panzer' else label4.caption:='Panzer';
    if label4.Caption='' then label4.caption:='Panzer' else label5.caption:='Panzer';
    if label5.Caption='' then label5.caption:='Panzer' else label6.caption:='Panzer';
    if label6.Caption='' then label6.caption:='Panzer' else label7.caption:='Panzer';
    if label7.Caption='' then label7.caption:='Panzer' else label8.caption:='Panzer';
    if label8.Caption='' then label8.caption:='Panzer' else label9.caption:='Panzer';
    if label9.Caption='' then label9.caption:='Panzer' else label10.caption:='Panzer';
    if label10.Caption='' then label10.caption:='Panzer' else label11.caption:='Panzer';
end;


Das doofe ist nur, er schreibt es in jedes Feld ...

Ich hoffe ihr könnt mir Tipps geben.

In Hoffnung
gfckiller


Moderiert von user profile iconMartok: Quote- durch Delphi-Tags ersetzt


glotzer - Sa 13.11.10 18:46

das erste was ich sehe ist das da ein begin...end fehlt


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
    if Checkbox1.State=cbChecked then
    begin
        if label3.Caption='' then label3.caption:='Panzer' else label4.caption:='Panzer';
        if label4.Caption='' then label4.caption:='Panzer' else label5.caption:='Panzer';
        if label5.Caption='' then label5.caption:='Panzer' else label6.caption:='Panzer';
        if label6.Caption='' then label6.caption:='Panzer' else label7.caption:='Panzer';
        if label7.Caption='' then label7.caption:='Panzer' else label8.caption:='Panzer';
        if label8.Caption='' then label8.caption:='Panzer' else label9.caption:='Panzer';
        if label9.Caption='' then label9.caption:='Panzer' else label10.caption:='Panzer';
        if label10.Caption='' then label10.caption:='Panzer' else label11.caption:='Panzer';
    end;
end;


bummi - Sa 13.11.10 18:47

die Zahlen bitte anpassen..

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm2.CheckBox1Click(Sender: TObject);
var
  I: Integer;
  l:TLabel;
begin
  if Checkbox1.Checked then
    for I := 1 to 6 do
      begin
        l := TLabel(FindComponent('Label' + IntToStr(i)));
        if Assigned(l) and (l.Caption = ''then
            begin
               l.Caption := 'Panzer';
               break;
            end;
      end;
end;


gfckiller - Sa 13.11.10 18:55

Wow, danke. Es klappt. Vielleicht noch ganz kurz die Frage, wenn gegen den Soldaten jetzt nichtnur Panzer kämpfen können, sondern noch....weiß nicht, 3 andere Einheiten, wie lass ich die in den entsprechneden Label-Feldern darstellen?:(

Trotzdem ein riesen Dank an dich.


bummi - Sa 13.11.10 19:02

Ich fürchte ich haben noch nicht verstanden was Du vorhast :?:


gfckiller - Sa 13.11.10 19:14

Kein Problem. :)
Hier einmal ein konkretes Beispiel:
Wenn ich jetzt Soldat anklicke, soll im 1. Label stehen: Panzer, im 2. Mine im 3. Panzerfaust...

Wenn ich jetzt Panzer anklicke(siehe Bild) dann soll im 1. Label stehen: Panzer, im 2. Panzerfaust im 3. Antipanzermine...

ABER wenn ich jetzt zuerst Soldat anklicke, und die ersten 3 Labelfelder dadurch belegt sind, und ich nun Panzer anklicke müssten die nächsten 3 Sachen ja dann in Label4 Label5 und Label6 stehen..andersherum natürlich genaus, wenn ich zuerst mit Panzer anfange sollten die Soldatensachen bei Label4 5 und 6 weitergehen. Ich weiß hohe Ansprüche..aber ich wollt es echt mal versuchen :(


Hab mir zum schluss dann auch gedacht (in meinem Fall kommt ja die Panzerfaust 2x vor) dass doppelte Sachen dann wegfallen und bloß einmal erwähnt sein brauchen. Aber das denke ich, ist dann doch zu viel verlangt...

Ich hoffe cih konnte es ein bisschen besser erklären.
Mit freundlichen Grüßen
Patrick


bummi - Sa 13.11.10 19:27

ich habe es immer noch nicht ganz "gefressen" und Bild finde ich keines, aber kann es sein daß Du Dir mit einer Listbox und dem Einfügen/Anhängen von Texten leichter tätest?


gfckiller - Sa 13.11.10 19:54

Hm wo du das so sagst, befürchte ich auch, dass es (mir) aufjedenfall einfacher fallen würde..
Ich werd es gleich mal probieren , in der Hoffnung, dass es klappt. :)

Danke trotzdem für die Hilfe.
Einen schönen Abend wünsch ich noch.


Gerd Kayser - Sa 13.11.10 20:06

Warum so umständlich mit zig Labeln? Verwende ein Label. Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TMainform.Button1Click(Sender: TObject);
begin
  Label1.Caption := 'Panzer' + #13 + 'Mine' + #13 + 'Soldat';
  if Pos(Label1.Caption, 'Panzerfaust') = 0 then  // bereits enthalten?
    Label1.Caption := Label1.Caption + #13 +'Panzerfaust';
end;


Martok - Sa 13.11.10 20:28

Visuelle Komponenten sind nicht für die Datenhaltung, nur für die Darstellung gedacht!


Gerd Kayser - Sa 13.11.10 20:31

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Visuelle Komponenten sind nicht für die Datenhaltung, nur für die Darstellung gedacht!
Wenn ich die Ausgangsfragestellung richtig interpretiere, dann geht es um die Darstellung, nicht um Datenhaltung. Schließlich sollen in dem Spiel Informationen angezeigt werden.


bummi - Sa 13.11.10 21:42

@Gerd Kayser
jep, aber Du parst die Darstellung....


Gerd Kayser - Sa 13.11.10 21:45

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
jep, aber Du parst die Darstellung....
Warum kompliziert, wenn es auch einfacher geht? ;-)


bummi - Sa 13.11.10 21:53

eben... :D


Gerd Kayser - Sa 13.11.10 22:21

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
eben... :D
Na, wenn es so stört, hier eine andere Lösung:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TMainform.Button5Click(Sender: TObject);
var
  Text     : string;
  Schleife : integer;
begin
  Text := '';
  for Schleife := 0 to ComponentCount - 1 do
    if (Components[Schleife] is TCheckBox) then
      if (TCheckBox(Components[Schleife]).Checked) then
        Text := Text + TCheckBox(Components[Schleife]).Caption + #13;
   if (Text <> ''then
     if (AnsiLastChar(Text) = #13then
       Delete(Text, Length(Text), 1);
   Label1.Caption := Text;
end;

Edit1: Die letzte if-Abfrage geändert. Damit kommt die Prozedur auch mit 0 angekreuzten CheckBoxen klar.


gfckiller - So 14.11.10 01:51

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
Warum so umständlich mit zig Labeln? Verwende ein Label. Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TMainform.Button1Click(Sender: TObject);
begin
  Label1.Caption := 'Panzer' + #13 + 'Mine' + #13 + 'Soldat';
  if Pos(Label1.Caption, 'Panzerfaust') = 0 then  // bereits enthalten?
    Label1.Caption := Label1.Caption + #13 +'Panzerfaust';
end;


Hallo nocheinmal,

hab das eben erst gelesen und wollte es mal ausprobieren, muss dann aber doch nochmal fragen.:/

Wenn ich das so einfüge, war mir klar, dass es nicht funktionieren kann , aber was muss ich gleich nochmal ändern, damit es funzt...

Fehler wäre:


[Error] Unit1.pas(57): ';' expected but '.' found
[Error] Unit1.pas(59): Undeclared identifier: 'Label1'
[Error] Unit1.pas(60): Incompatible types
[Error] Unit1.pas(60): Type of expression must be BOOLEAN
[Error] Unit1.pas(71): ';' expected but '.' found
[Error] Unit1.pas(73): Declaration expected but end of file found
[Error] Unit1.pas(40): Unsatisfied forward or external declaration: 'TForm1.CheckBox1Click'
[Error] Unit1.pas(41): Unsatisfied forward or external declaration: 'TForm1.Button1Click'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'


P.s. Japs, es geht mir um die Darstellung nicht um die Haltung der Daten :)

Gruß

---------------

Ah schon gut, ich hab es.


jaenicke - So 14.11.10 07:28

user profile icongfckiller hat folgendes geschrieben Zum zitierten Posting springen:
P.s. Japs, es geht mir um die Darstellung nicht um die Haltung der Daten :)
Du packst aber die Daten nicht nur zur Darstellung in die Labels, sondern du liest die auch wieder dort aus.

Und damit benutzt du die visuellen Komponenten als Datenspeicher. Damit machst du dir das Leben nur unnötig schwer...

Wenn du den aktuellen Status unabhängig von den Labels speichern würdest, könntest du ihn dort auch direkt auslesen.


gfckiller - Mo 15.11.10 12:15

Ah, so hab ich das nicht gesehen.
Danke für den Vermerk.

Gruß