Announcement

Collapse
No announcement yet.

Delphi7: color properties als RGB

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Delphi7: color properties als RGB

    Hallo Gemeinde,

    ich möchte Farbeinstellungen in der RGB-Darstellung (zB. 00FF00) durchführen.
    Finde diese Möglichkeiten jedoch nicht. Entweder hab ich's übersehen
    oder diese Möglichkeit muss man selber programmieren.
    Hat da jemand schon Erfahrungen?

    Gruß

  • #2
    Entweder verstehe ich das Problem nicht oder die Lösung ist ganz einfach - nachdem 00FF00 ein Hex-Wert ist, gehört ein $ vorangestellt, also so:
    Form.Color := $00FF00;

    bye,
    Helmut

    Comment


    • #3
      Hallo Helmut,

      ich beziehe mich hier auf einen Beitrag von CalganX (http://www.delphipraxis.net/515340-post2.html) zur Umwandlung eines Hexadezimal-Wertes in RGB. Scheint nicht ganz so einfach zu sein wie Du es schreibst. Hab es auch ausprobiert: Die RGB-Werte (zB. $00FF33) nimmt er sehr schön. Nun muss ich mich mit der Farbpalette auseinandersetzen - sollte schon exakt sein, was CalganX doch in Frage stellt.

      So, habe die Feststellung von CalganX bestätigen müssen:
      $FF0000 - blau (muss ROT sein)
      $00FF00 - grün RICHTIG
      $0000FF - rot (muss BLAU sein)
      $000000 - schwarz RICHTIG
      $FFFFFF - hellgrau (muss WEISS sein)
      $FFFF00 - cyan (muss GELB sein)
      ... usw.
      man sieht, die Farbreihenfolge ist vertauscht. SOLL: RGB - IST: BGR
      (Wahrscheinlich war der Programmierer ein Linkshänder..)

      Weiterhin gibt es einen Example Code in der Delphi Hilfe:
      procedure TForm1.Button1Click(Sender: TObject);
      var
      i: Integer;
      begin
      Label1.Caption := '';
      for i := 1 to Length(Edit1.Text) do
      begin
      try
      Label1.Caption := Label1.Caption + IntToHex(Edit1.Text[i],2) + ' ';
      except
      Beep;
      end;
      end;
      end;


      Und der produziert einen Fehler:
      There is no overloaded version of 'IntToHex' that can be called with these arguments

      Nun muss ich eine overloaded function bereitstellen (sollte Delphi eigentlich selber gemacht haben):
      function IntToHex(Value: Integer; Digits: Integer): string; overload;

      trotzdem ist die Fehlermeldung die gleiche.

      Ganz schön chaotisch...


      Gruß
      Hanno
      Zuletzt editiert von Hanno Reimann; 07.01.2011, 12:14.

      Comment


      • #4
        Was hast du jetzt eigentlich als Ausgangsbasis - den Hexstring in Form RGB oder die 3 Farbwerte als Integer oder was?

        bye,
        Helmut

        Comment


        • #5
          Edit1.Text[i]

          dürfte kein Integer sein
          Christian

          Comment


          • #6
            Hallo Helmut,

            Ausgangsbasis ist ein String in der Form A0B1C2 - wie üblich in der allgemeinen Farbdarstellung.
            Somit muss ich den String zerlegen in 3x2 Hex-Werte (A0, B1, C2), die muss ich dann in einen TColor-Wert umwandeln (Delphi-Farbdarstellung $00C2B1A0). Ist doch sehr umständlich.
            Umgekehrt ist es leichter..

            Gruß
            Hanno

            Comment


            • #7
              Originally posted by Christian Marquardt View Post
              Edit1.Text[i]

              dürfte kein Integer sein
              wie soll ich sonst die einzelnen Zeichen des Ausdrucks abfragen, wenn nicht über die Stellenangabe mittels Integer? Ich denke, hier stimmt der Code (noch).

              Gruß
              Hanno

              Comment


              • #8
                Ausgangsbasis ist ein String in der Form A0B1C2
                Irgendwie ist nicht klar, welchen Weg du beschreiten willst:

                1) hast du eine $00FFFFFF Wert vorliegen und willst diesen in 3 int a 255,255,255 teilen oder

                2) hast du 3 int 255,255,255 vorliegen und willst daraus $00FFFFFF

                machen

                Nach deiner "Ausgangsbasis" würde 1) zutreffen. Wo würde da die Umwandlung eines int-Wertes nach Hex vorkommen (Funktion IntToHex)? Eher wäre hier HexToInt anzuwenden.

                Edit1.Text[i]

                deutet darauf hin, dass in einem Texteingabefeld ein Wert steht.

                Selbst wenn da 11 drin steht ergibt das einen String und kein int. Somit wäre StrToInt anzuwenden um ein int zu bekommen

                EDIT

                HexToInt ist wohl in als Funktion nicht vohanden:


                Code:
                function HexToInt(const HexWert:String):Integer;
                var i:Integer;
                s:String;
                begin
                Result:=0;
                s:=UpperCase(HexWert);
                for i:=1 to Length(s) do if (Ord(s[i]) in [0..47, 58..64, 71..255]) then
                begin
                Result:=-1;
                Break;
                end; // for i
                if (Result=0) then for i:=0 to Length(s)-1 do
                Result:=Result+(HexCharToWert(s[Length(s)-i])*Round(Power(16, i)));
                end;
                Zuletzt editiert von Christian Marquardt; 07.01.2011, 15:04.
                Christian

                Comment


                • #9
                  Hallo,

                  ich scheine mich missverständlich auszudrücken:
                  Meine Ausgangsbasis ist 3x2 HEX, also die genormte Farbdarstellung in vielen Zeichenprogrammen. Als Beispiel FF00AA (FF ist der Rotwert, 00 ist der Grünwert und AA ist der Blauwert), wobei FF=255 ist.
                  Also muss ich diesen Ausdruck "zerhackstückeln" und umwandeln...

                  Gruß
                  Hanno

                  Comment


                  • #10
                    Ich sehe das i als "Buchstabenzähler", muss also ein Integer sein. Da Edit1.Text[i] in einer for-Schleife liegt, wird Zeichen für Zeichen abgearbeitet (in HEX umgewandelt). Wo also leigt mein Denkfehler (und gleichermaßen der von Delphi) ?

                    Die Fehlermeldung sagt auch nichts darüber, sondern dass IntToHex nicht als 'overloaded' verfügbar ist..

                    Gruß
                    Hanno
                    Zuletzt editiert von Hanno Reimann; 07.01.2011, 17:55.

                    Comment


                    • #11
                      Frage, wenn du 3 Hex-Werte hast, was willst du mit der Funktion IntToHex?

                      Des Weiteren schau dir dir folgenden Funktionen an:

                      long zielcolor=ColorToRGB(Panel2.Color);
                      int zielrot=GetRValue(zielcolor);
                      int zielgruen=GetGValue(zielcolor);
                      int zielblau=GetBValue(zielcolor);

                      Des Weiteren ist der Inhalt eines Texieingabefeldes immer ein String
                      Zuletzt editiert von Christian Marquardt; 07.01.2011, 16:43.
                      Christian

                      Comment


                      • #12
                        ...
                        Code:
                        function HexToInt(const HexWert:String):Integer;
                        var i:Integer;
                        s:String;
                        begin
                        Result:=0;
                        s:=UpperCase(HexWert);
                        for i:=1 to Length(s) do if (Ord(s[i]) in [0..47, 58..64, 71..255]) then
                        begin
                        Result:=-1;
                        Break;
                        end; // for i
                        if (Result=0) then for i:=0 to Length(s)-1 do
                        Result:=Result+(HexCharToWert(s[Length(s)-i])*Round(Power(16, i)));
                        end;
                        .. was ist mit HexCharToWert? Integer? Und wo kommt 'Power' her?

                        Gruß
                        Hanno

                        Comment


                        • #13
                          http://www.google.de/search?sourceid...elphi+hextoint

                          http://www.delphi-library.de/topic_e...n_21598,0.html
                          Christian

                          Comment


                          • #14
                            Originally posted by Christian Marquardt View Post
                            Frage, wenn du 3 Hex-Werte hast, was willst du mit der Funktion IntToHex?
                            habe leider nur die 'HEX-Darstellung' im Editfeld, also als normalen String.
                            Der muss umgewandelt werden in echte HEX-Werte.
                            Also kurz als Beispiel:
                            Als Str: FF00FF (aus Editfield)
                            Und jetzt in Hex zerstückeln: R=FFh; G=00h; B=FFh
                            Diese dann in Bytes umwandeln: R=255; G=0;B=255
                            Mit den Bytes kann ich dann die Farben darstellen:
                            var R,G,B: Byte;
                            col: TColor;
                            begin
                            col:=RGB(R,G,B);
                            Irgendwas.Color:=col;

                            ...
                            Und die RGB-Funktion:
                            Function RGB(R,G,B: Byte): TColor;
                            Begin
                            Result := B Shl 16 Or
                            G Shl 8 Or
                            R;
                            End;


                            Mein Prob ist den String in Hex zerstückeln und in Bytes umwandeln

                            Trotzdem erst mal vielen Dank für das Eindenken in meine wirren Erklärungen
                            (wenn man im Thema ist, vergisst man leicht, dass jemand anders eine genaue Beschreibung braucht..)

                            Gruß
                            Hanno

                            Comment


                            • #15
                              Originally posted by Christian Marquardt View Post
                              Irgendwie ist nicht klar, welchen Weg du beschreiten willst:

                              1) hast du eine $00FFFFFF Wert vorliegen und willst diesen in 3 int a 255,255,255 teilen oder
                              Hab ich nicht
                              Originally posted by Christian Marquardt View Post
                              2) hast du 3 int 255,255,255 vorliegen und willst daraus $00FFFFFF
                              machen
                              Hab ich auch nicht.
                              Ich habe einen String in der Form HEX vorliegen. Bleibt aber ein String!
                              Ich sehe hier auch, dass ichIntToHex nicht gebrauchen kann, weil ich zB. 3A nicht als Int darstellen kann...

                              Originally posted by Christian Marquardt View Post
                              Nach deiner "Ausgangsbasis" würde 1) zutreffen. Wo würde da die Umwandlung eines int-Wertes nach Hex vorkommen (Funktion IntToHex)? Eher wäre hier HexToInt anzuwenden.

                              Edit1.Text[i]

                              deutet darauf hin, dass in einem Texteingabefeld ein Wert steht.
                              Stimmt. Ist ein String, logi. Aber ich kann keinen Int draus machen, wegen der Buchstaben!

                              Originally posted by Christian Marquardt View Post
                              Selbst wenn da 11 drin steht ergibt das einen String und kein int. Somit wäre StrToInt anzuwenden um ein int zu bekommen

                              EDIT

                              HexToInt ist wohl in als Funktion nicht vohanden:


                              Code:
                              function HexToInt(const HexWert:String):Integer;
                              var i:Integer;
                              s:String;
                              begin
                              Result:=0;
                              s:=UpperCase(HexWert);
                              for i:=1 to Length(s) do if (Ord(s[i]) in [0..47, 58..64, 71..255]) then
                              begin
                              Result:=-1;
                              Break;
                              end; // for i
                              if (Result=0) then for i:=0 to Length(s)-1 do
                              Result:=Result+(HexCharToWert(s[Length(s)-i])*Round(Power(16, i)));
                              end;

                              Comment

                              Working...
                              X