[Gelöst] TComponent in String umwandeln

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

[Gelöst] TComponent in String umwandeln

Beitrag von ConcAPPtLab »

Hallo Leute,

nach einiger Zeit des Programmierens stehe ich mal wieder vor einem Problem. Ich hab jetzt bestimmt 2 Stunden im Internet gesucht und alles mögliche ausprobiert, aber ich krieg es einfach nicht gelöst:

Ich habe ein Programm, das mit Hilfe einer Animation des Randes (wird dünner bzw. dicker) anzeigt, welcher 'Button' (hier Shapes) gewählt ist. Und soweit ist erstaml alles fertig programmiert. Aber ich hänge schon die ganze Zeit an dieser Stelle:

Code: Alles auswählen

Case (varShape2 as TComponent).Name of
          ShapeContinue: KeyDown(self; var VK_Space; nil);
          ShapeExit: Close;
          ShapeRestart: NewGame;
        end;
Denn bei 'Case (varShape2 as TComponent).Name of' werden immer folgende Fehlermedungen ausgegeben: unit1.pas(300,24) Error: Constant and CASE types do not match
unit1.pas(300,24) Error: String expression expected(P.S.: varShape as TComponent.Name war mein letzter verzweifelter Versuch das zu lösen. Vorher hatte ich zig andere Versionen probiert)

Kann mir jemand weiterhefen?

Besten Dank jetzt schon, ConcAPPtLab
Zuletzt geändert von ConcAPPtLab am So 26. Okt 2014, 22:35, insgesamt 1-mal geändert.
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TComponent in String umwandeln

Beitrag von mse »

Wie sind "varShape2", "ShapeContinue", "ShapeExit" und "ShapeRestart" definiert?

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: TComponent in String umwandeln

Beitrag von ConcAPPtLab »

varShape1, varShape2: TComponent;

ShapeContinue, ShapeRestart, ShapeExit: TShape;
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TComponent in String umwandeln

Beitrag von mse »

Die Typen von "case" Variablen und Zweigkonstanten müssen übereinstimmen und es sind auch nur ordinale Konstanten und je nach FPC Version auch strings erlaubt. Alternative:

Code: Alles auswählen

 
if varShape2 = ShapeContinue then begin
end
else begin
 if varshape2 = ShapeExit then begin
 end
else ....
 
Eine andere Möglichkeit besteht darin, die "tag" property von "ShapeContinue", "ShapeExit","ShapeRestart" auf 0,1,2 zu setzen und dann

Code: Alles auswählen

 
case varShape2.tag of
 0: begin //ShapeContinue
 end;
 1: begin //ShapeExit
 end;
 ...
 
Edit:
Vielleicht hattest du ja diese Version im Auge:

Code: Alles auswählen

 
case varShape2.name of
 'ShapeContinue': begin 
 end;
 'ShapeExit': begin
 end;
...
 

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: TComponent in String umwandeln

Beitrag von ConcAPPtLab »

Ja genau. Das Letzte ist es. Dankeschön :D Hab mal wieder zu kompliziert gedacht :)

Und ich hab noch ne andere Frage, die eigentlich nur indirekt mit dem Thema zu tun hat.
Wenn ein Knopf ausgewählt ist, soll er auch heller sein als normal. Seine Helligkeit soll um 10 erhöht werden. Und das wie beim Rand als Animation. Gibt es eine Möglichkeit die Helligkeit eines Shapes abzufragen und auch zu verändern? Oder muss ich über die RGB-Werte gehen? (Dann wüsste ich aber auch nicht, wie).

Grüße ConcAPPtLab
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: TComponent in String umwandeln

Beitrag von theo »

Eine Möglichkeit könnte so gehen:

Code: Alles auswählen

uses FPimage;
 
procedure TForm1.Button1Click(Sender: TObject);
var col:TFPColor;
begin
 col:=TColorToFPColor(Shape1.Brush.Color);
 col.red:=col.red+10*$FF;
 col.green:=col.green+10*$FF;
 col.blue:=col.blue+10*$FF;
 Shape1.Brush.Color:=FPColorToTColor(col);
end;   
Es gibt andere Varianten. Das Beispiel ist minimal. Bereichsgrenzen (hier Word) müssten noch geprüft werden und "Helligkeit" ist relativ.
Wenn du mehr wissen willst, hier gab es schon "immer" gute Grafik-Infos für Delphi:
http://www.efg2.com/Lab/Graphics/Colors/index.html
http://www.efg2.com/Lab/Graphics/Colors/HSV.htm

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: TComponent in String umwandeln

Beitrag von ConcAPPtLab »

Also schon mal Danke für die schnelle Antwort.
Ich habs jetzt mal reingemacht, obwohl ich keine Ahnung habe was ich da gerade genau programmiere :D

Und es wird auch die Farbe geändert, aber es funktioniert nicht ganz so wie gewünscht. ShapeContinue (grün) und ShapeRestart (rot) werden, wenn sie abgewäht werden kurzzeitig blau (unterschiedlich helles blau, aber beide werden erst kurz blau). Beim Button ShapeExit (orange) funktionierts gar nicht. Der ist erst orange, wird dann beim anwählen kurz grü, dann wieder das gleiche orange wie vorher (keine Helligkeitsanderung). Genau so sieht es auch beim Abwählend es Knopfes aus.

Mein Code:

Code: Alles auswählen

col:=TColorToFPColor(TShape(varShape1).Brush.Color);
 
    if TShape(varShape1).Pen.Width<>1 then
    begin
    repeat
        TShape(varShape1).Pen.Width:=TShape(varShape1).Pen.Width-1;
        col.red:=col.red-10*$FF;
        col.green:=col.green-10*$FF;
        col.blue:=col.blue-10*$FF;
        TShape(varShape1).Brush.Color:=FPColorToTColor(col);
        Application.ProcessMessages;
        Sleep(75);
      until (TShape(varShape1).Pen.Width=1) or (varKeyPress=2) or (Key=VK_Return)
             or (Key=VK_Space);
 
    TShape(varShape1).Pen.Width:=1;
 
    case varShape1.Name of
        'ShapeContinue': TShape(varShape1).Brush.Color:=$0000C493;
        'ShapeExit': TShape(varShape1).Brush.Color:=$000080FF;
        'ShapeRestart': TShape(varShape1).Brush.Color:=$000000D7;
      end;
 
    col:=TColorToFPColor(TShape(varShape2).Brush.Color);
 
      repeat
        TShape(varShape2).Pen.Width:=TShape(varShape2).Pen.Width+1;
        col.red:=col.red+10*$FF;
        col.green:=col.green+10*$FF;
        col.blue:=col.blue+10*$FF;
        TShape(varShape2).Brush.Color:=FPColorToTColor(col);
        Application.ProcessMessages;
        Sleep(75);
      until (TShape(varShape2).Pen.Width=3) or (varKeyPress=2) or (Key=VK_Return)
             or (Key=VK_Space);
 
      TShape(varShape2).Pen.Width:=3;
 
      case varShape2.Name of
        'ShapeContinue': TShape(varShape2).Brush.Color:=$0000D9A3;
        'ShapeExit': TShape(varShape2).Brush.Color:=$00158AFF;
        'ShapeRestart': TShape(varShape2).Brush.Color:=$000000EC
      end;
 
 
    end;
Hast du ne Idee wo der Fehler ist?

ConcAPPtLab
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: TComponent in String umwandeln

Beitrag von theo »

Wie oben geschreiben: Du muss die Bereichsgrenzen Prüfen.
Bei ShapeExit hast du z.B. hinten einen FF Wert. Das ist bereits das Maximum. Wenn du da was dazurechnest, fängt's wieder bei 0 an.
Bei FPColor wird mit Word gerechnet. Also ist da das Maximum $FFFF ändert aber nichts am Problem des Überlaufs.

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: TComponent in String umwandeln

Beitrag von ConcAPPtLab »

Ahh. Jetzt versteh ich. Dankeschön :)
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: TComponent in String umwandeln

Beitrag von theo »

Z.B. so

Code: Alles auswählen

uses Math, FPimage;
...
procedure TForm1.Button1Click(Sender: TObject);
var col:TFPColor;
begin
 col:=TColorToFPColor(Shape1.Brush.Color);
 col.red:=Min(Max(col.red+10*$FF,0),$FFFF);
 col.green:=Min(Max(col.green+10*$FF,0),$FFFF);
 col.blue:=Min(Max(col.blue+10*$FF,0),$FFFF);
 Shape1.Brush.Color:=FPColorToTColor(col);
end;     
Aber du darfst trotzdem noch selber überlegen warum... :wink:

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: TComponent in String umwandeln

Beitrag von ConcAPPtLab »

Ich habs jetzt über if abgefragt, damit ich wenigstens da weiß, was ich mache ;)

funktioniert jetzt, dankeschön :)
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Antworten