Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Fehler: IF: Kein Teil eienr Menge (Bedingung) (https://www.delphipraxis.net/157921-fehler-if-kein-teil-eienr-menge-bedingung.html)

SvenLittkowski 29. Jan 2011 21:08

Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Code:
for Runde:=0 to Length(TheColor1) do
if(TheColor1[1]<>'$')and(Ord(TheColor1[Runde])<>[48..57])and(Ord(TheColor1[Runde])<>[65..70]) then ...
Dieser Code erzeugt bei mir die folgende Fehlermeldung:
Zitat:

Zitat von Delphi 7
[Error] Box1.pas(350): Incompatible types: 'TObject' and 'Char'
[Error] Box1.pas(350): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'Integer'

Ich will mit diesem Code testen, ob ein String ("TheColor1") als Farbe (z.B. "$00004F4F") interpretiert werden kann. Was mache ich falsch (kann die Fehlermeldungen leider nicht ausarbeiten)?

Bummi 29. Jan 2011 21:13

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
ein befremdlicher Ansatz aber was Du suchst ist wohl
Delphi-Quellcode:
not (Ord(TheColor1[Runde]) in [65..70])

rollstuhlfahrer 29. Jan 2011 21:14

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
von der Struktur her sehe ich keinen Fehler. Teile mal deine IF-Anweisung in 3 Abfragen auf. Dann siehst du, bei welcher es hakt.

Ich denke aber, dass es scheinbar in der Zeile davor hakt.

Bernhard

SvenLittkowski 29. Jan 2011 22:01

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Ja, habe ich getan. Ich habe den Code auch etwas abgeändert. Trotzdem der gleiche Erfolg:

Code:
   IsColor:=True;
   if(TheColor1[1]<>'$') then IsColor:=False;
   for Runde:=0 to Length(TheColor1) do
   begin
    if not(Ord(TheColor1[Runde]) in [48..57])and not(Ord(TheColor1[Runde]) in [65..70]) then IsColor:=False;
   end;
Manchmal sieht man den Wald vor lauter Bäumen nicht. Ich bin mir ganz sicher, der Fehler ist sehr dumm und leicht zu beheben. Trotzdem gelingt es mir bis jetzt nicht. Brüte schon seit Stunden darüber...

Bummi 29. Jan 2011 22:08

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Delphi-Quellcode:
for Runde:=2 to

SvenLittkowski 29. Jan 2011 23:42

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
"Runde:=2 to ..."?

Ich denke auch, "0" war falsch. Ich habe jetzt Runde bei "1! anfangen lassen. Nein, warte! Du hast Recht! Denn [1] ist ja das "$"-Zeichen, also geht es erst bei [2] los! Danke!

Aber es handelt sich um einen Fehler, der beim Compilieren entsteht, nicht zur Laufzeit. Da muß also etwas anderes, Gravierendes nicht stimmen.

Hier erneut die Fehlermeldungen:

Zitat:

Zitat von Delphi 7
[Error] Box1.pas(351): Incompatible types: 'TObject' and 'Char'
[Error] Box1.pas(351): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'Integer'

Und hier der Quelltext, wie er jetzt ist:

Code:
   IsColor:=True;
   if(TheColor1[1]<>'$') then IsColor:=False
   else
   begin
    for Runde:=2 to Length(TheColor1) do
    begin
     if (not Ord(TheColor1[Runde]) in [48..57]) and (not Ord(TheColor1[Runde]) in [65..70]) then IsColor:=False;  // LINE 351, Fehler-Cursor zwischen "[Runde])" und " in [48"
    end;
   end;

rollstuhlfahrer 29. Jan 2011 23:47

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
kannst du uns dann noch sagen, welche der Zeilen die Nummer 351 hat?

Bernhard

PS: Starte Delphi und deinen Rechner mal neu, weil da weder ein TObject ist, noch ein Pointer.

SvenLittkowski 30. Jan 2011 00:00

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Auch nach Restart das selbe Progblem. ich habe etwas zum vorherigen Posting hinzugefügt (dortiger Programm-Code).

Bummi 30. Jan 2011 00:14

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
irgendeine gleichnamige Variable von einem anderen Typ irgendwo in Deinem Source ...?

SvenLittkowski 30. Jan 2011 00:28

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Nein, nirgends. Worum es mir eigentlich nur geht, ist festzustellen, ob der String entweder einen Farbwert wiedergibt (z.B. "$00004F4F") oder den Namen einer Farbe (z.B. "clBlack"). Was ich in Delphi vermisse, ist eine Testfunktion wie "IsColor" oder "IsReal", wie ich es von einigen anderen Programmiersprachen her kenne.

sx2008 30. Jan 2011 02:09

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Delphi-Quellcode:
function CharIsHexDigit(c:char):Boolean;
begin
  Result := c in ['0'..'9','A'..'F','a'..'f'];
end;

function IsHexColor(const s : string):boolean;
var
  i : integer;
begin
  Result := (Length(s) >= 7{Mindestlänge}) and (s[1]='$');
  if not Result then
    exit;
  for i := 2 to length(s) do
  begin
    if not CharIsHexDigit(s[i]) then
    begin
      result := False;
      Exit;
    end;
  end;
end;

scrat1979 30. Jan 2011 07:31

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Vielleicht hilft Dir die Funktion val weiter...

Bummi 30. Jan 2011 08:32

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Warum nimmst Du nicht die Funtion StringToColor, gekapselt mit Try Except?

Sir Rufo 30. Jan 2011 11:32

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Du schreibst
Delphi-Quellcode:
If ( not Ord( Foo ) in [..] ) then
es muss aber wie folgt lauten
Delphi-Quellcode:
if not ( Ord( Foo ) in [..] ) then
.
Das
Delphi-Quellcode:
not
muss aus der Klammer raus

SvenLittkowski 30. Jan 2011 23:15

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
sx2008 und alle anderen: vielen Dank, Ihr habt mir ein sehr großes Stück weitergeholfen!

Es gibt nun noch ein anderes Problem, welches ich lösen muß. Beim Schließen des Programmes werden in der INI-Datei die vom user festgesetzten Farben gespeichert. Mir fällt aber auf, daß einige Farben nicht als beispielsweise "$00FFDDAA" gespeichert werden, sondern beispielsweise als "clBlue". Dies gibt Probleme. Wie kann ich den Farbwert von cl-definierten Farben als $-Werte speichern?

Bummi 30. Jan 2011 23:19

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
wenn Du meinen Vorschlag auf #13 verwendest
(StringToColor) hast Du die Farbe in einer TColor Variablen diese kannst Du dann per
'$'+IntToHex(c,8) ausgeben.

SvenLittkowski 30. Jan 2011 23:47

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Ein letztes Problem in Sachen Farbe und Farbverarbeitung vorerst:

Code:
var
 TheColor1, TheColor2: String;
 TColor1, TColor2:     TColor;

(1723) TheColor1:=ColorToString(Label1.Font.Color);
(1724) TheColor2:=ColorToString(Label1.Color);
(1725) IdentToColor(TheColor1,TColor1);
(1726) IdentToColor(TheColor2,TColor2);
gibt mir diesen Fehler:

Zitat:

Zitat von Delphi 7
[Error] Box1.pas(1725): Types of actual and formal var parameters must be identical
[Error] Box1.pas(1726): Types of actual and formal var parameters must be identical


Hmmm... Woran liegt's?

Jakunar 31. Jan 2011 01:50

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Das Problem dabei ist, dass die Funktion als folgende deklariert ist:
Code:
function IdentToColor(const Ident: string; var Color: Longint): Boolean;
Ich weiss gerade nicht was fuer Typ TColor explizit ist, ist aber auch egal, denn die Funktion verlangt ausdruecklich den Referenztyp Longintund erlaubt nicht den Typ TColor!

Hab's eben schnell mit TColor getestet und bekam den gleichen Fehler, aber mit LongInt hats funktioniert!
Code:
var
  TColor1: LongInt;
  TheColor1: String;
begin
  IdentToColor(TheColor1, TColor1)
Gruss Jakunar

Bummi 31. Jan 2011 06:05

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Ich weiß nicht ob D7 hier noch ein Problem hat, aber:
Zitat:

Anmerkung: Falls der String-Bezeichner einer Farbe sowohl einen Hexadezimalwert als auch eine Farbkonstante darstellen kann, verwenden Sie die Funktion StringToColor.

ansonsten geht auch
Delphi-Quellcode:
IdentToColor(TheColor1, Integer(TColor1));

SvenLittkowski 31. Jan 2011 16:59

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Ahhh, DAS hat schon mal weitergeholfen. Vielen Dank an Euch.

Ich muß nun zusehen, wie ich TColor in LongInt umwandle. Wenn ich dafür eine Lösung finde, alleine oder zusammen), dann sollte dies endlich alles funktionieren. Ich schaue moch mal im Internet nach einer Lösung um. Aber wenn hier jemand eine Idee hat, dann würde ich mich sehr freuen.

Bummi 31. Jan 2011 17:04

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Du musst nicht nicht umwandeln nur zuweisen
Longword, LongInt, Int32, TColor, Integer, Cardinal
Int32 , alles 4 Byte im Speicher ....

SvenLittkowski 31. Jan 2011 17:14

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Danke für Deine schnelle Antwort. Zuweisen... Ich arbeite zwar schon seit Jahren mit Delphi (7), aber mit Speicherzuweisungen habe ich noch nie gearbeitet. Ich weiß ehrlich gesagt nicht, wie ich dies bewerkstelligen soll. Ich hatte gerade folgendes probiert: "ThisColor1:=ColorToString(GlowLabel1.Font.Color); "

Wobei ThisColor1 vom Typ LONGINT ist. Delphi sagt: "[Error] Box1.pas(1726): Incompatible types: 'Integer' and 'String'"

Aber ich habe mir inzwischen natürlich auch eigene Gedanken gemacht: die letzten sechs Ziffern des "$"-Wertes sind ja Hexadezimalziffern, in drei Blöcken. Außerdem weiß ich, daß jede Farbe auch durch eine sehr große Zahl (LongInt?) repräsentiert wird. Es gibt da bestimmt Wege, dieses Dreierpaket an Hex-Werten in so einen Wert umzuwandeln.

Bummi 31. Jan 2011 17:19

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Delphi-Quellcode:
ThisColor1:=GlowLabel1.Font.Color;
EDIT

StringToColor liefert dir aus einem String ein TColor welches Du in einem Longint oder Cardinal ablegen kannst.

SvenLittkowski 1. Feb 2011 04:49

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Irgendwie bewege ich mich noch immer auf dem Holzpfad. Ich komme einfach, trotz all Deiner Hilfen, nicht weiter. Ich habe Deinen Vorschlag (Color in LongInt umzuwandeln) aufgegriffen, finde aber bis jetzt keine entsprechende Delphi-Funktion zum Umwandeln. Nur ColorToRGB, ColorToString.

Mir geht es ja nur darum, in der programmeigenen INI-Datei die Farben des Benutzers abzuspeichern, aber nicht als "cl"-Wert, sondern nur als "$"-Wert. Jedoch, wenn der Benutzer sich eine Farbe im ColorDialog aussucht, kann es manchmal sein, daß diese Farbe als "cl"-Wert weitergegeben wird und nicht als "$"-Wert. StringToColor erzeugt doch auch Farbwerte wie "clRed", wenn der Benutzer die Farbe RGB FF 00 00 (reines rot) ausgesucht hatte.

Und Dein Zitat stimmt: das Problem steckt wirklich in den meisten Fällen zwischen den Ohren. Ich hoffe, ich fange nicht an, Euch alle zu langweilen mit meinen ewigen Fragen...


UPDATE

Ich habe jetzt eine andere Lösung gefunden:

Code:
var
 TheColor1, TheColor2: String;

 TheColor1:=TColorToHex(Sender,GlowLabel1.Font.Color);
 TheColor2:=TColorToHex(Sender,GlowLabel1.GlowColor);
 TheColor1:='$00'+Copy(TheColor1,5,2)+Copy(TheColor1,3,2)+Copy(TheColor1,1,2);
 TheColor2:='$00'+Copy(TheColor2,5,2)+Copy(TheColor2,3,2)+Copy(TheColor2,1,2);

function TAlpha.TColorToHex(Sender: TObject; Color: TColor): string;
begin
 Result:=IntToHex(GetRValue(Color),2)+IntToHex(GetGValue(Color),2)+IntToHex(GetBValue(Color),2);
end;

function TAlpha.HexToTColor(Sender: TObject; sColor: string): TColor;  // Nicht benutzt
begin
 Result:=RGB(StrToInt('$'+Copy(sColor,1,2)),StrToInt('$'+Copy(sColor,3,2)),StrToInt('$'+Copy(sColor,5,2)));
end;
Zitat:

Zitat von Delphi 7
Nun stimmt's!

Dieses Thema kann hiermit beendet werden. :-)

Sir Rufo 1. Feb 2011 11:45

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Es gibt ja immer mehrere Wege für eine Lösung, aber nur wenig smarte:
Delphi-Quellcode:
var
  MyColor : TColor;
  MyColorStr : String;
  tmpInt : Int64;
begin
  // Farbe in einen Hex-String umwandeln
  MyColorStr := '$' + IntToHex( MyColor );

  // String ( Integer oder Hex-Wert ) in eine Farbe umwandeln
  if TryStrToInt64( MyColorStr, tmpInt ) and ( tmpInt >= -$7FFFFFFF-1 ) and ( tmpInt <= $7FFFFFFF ) then
    MyColor := tmpInt
  else
    raise Exception.CreateFmt( '"%s" ist keine Farbe!', [ MyColorStr ] );

end;

Sir Rufo 1. Feb 2011 11:47

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Zitat:

Zitat von Sir Rufo (Beitrag 1078789)
Es gibt ja immer mehrere Wege für eine Lösung, aber nur wenig smarte:
Delphi-Quellcode:
var
  MyColor : TColor;
  MyColorStr : String;
  tmpInt : Int64;
begin
  // Farbe in einen Hex-String umwandeln
  MyColorStr := '$' + IntToHex( MyColor );

  // String ( Integer oder Hex-Wert ) in eine Farbe umwandeln
  if TryStrToInt64( MyColorStr, tmpInt ) and ( tmpInt >= -$7FFFFFFF-1 ) and ( tmpInt <= $7FFFFFFF ) then
    MyColor := tmpInt
  else
    raise Exception.CreateFmt( '"%s" ist keine Farbe!', [ MyColorStr ] );

end;

btw:
Delphi-Quellcode:
StrToInt
kann von Haus aus mit Hex-Werten umgehen, wenn das $-Zeichen vorangestellt wird.

SvenLittkowski 1. Feb 2011 16:22

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Auch 'ne nette Lösung. Kürzer und wesentlich eleganter als meine.

Bummi 1. Feb 2011 16:43

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
schau mal ins Posting #16

SvenLittkowski 2. Feb 2011 04:00

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Ohhhh. Stimt. Vollkommen richtig. Da habe ich Dir großes Unrecht getan, Bummi. Du warst der erste mit diesem Lösungsansatz. Zu diesem Zeitpunkt nahm ich aber noch an, daß jene Funktion auch "cl"-Werte erzeugt, nicht nur "$"-Werte, deswegen hatte ich gezögert, diese Lösung zu benutzen. Erst als Sir Rufo direkt erwähnte, daß jene Funktion NUR "$"-Werte erzeugt, habe ich sie näher betrachtet. Mein Fehler. Umso mehr Dank an Dich.

Sir Rufo 2. Feb 2011 10:09

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Zitat:

Zitat von SvenLittkowski (Beitrag 1078889)
Auch 'ne nette Lösung. Kürzer und wesentlich eleganter als meine.

Die Lösung ist nicht nur eleganter sondern auch korrekt.

Der Farbwert Rot wird durch folgenden HexCode dargestellt
Code:
$000000FF
.
Mir deiner Logik machst du daraus aber
Code:
FF0000
.
Beim Einlesen drehst du es zwar wieder richtig ... aber jeder der die gespeicherten Werte kontrollieren will und deinen Code nicht kennt ... :stupid:

Es heißt zwar RGB aber die einzelnen Farbwerte werden im HexCode nicht wie Text sondern wie eine Zahl betrachtet.
Code:
Text:
a
ab
abc
abcd
Wird ein Wort länger, dann "wächst" es nach rechts, aber eine Zahl ...
Code:
Zahl
   1
  12
 123
1234

SirThornberry 2. Feb 2011 11:48

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
@SvenLittkowski: Dir ist schon bewusst das deine letzten Fragen nichts mehr mit der ursprünglichen Frage zu tun haben und rein gar nicht zum Titel passen, oder? Bitte erstelle zukünftig für eine neue Frage auch ein neues Thema. :-) Das hat den Vorteil das du auch einen passenden Titel vergeben kannst was dazu führt das andere mit dem gleichen Problem über die Suche auch die Lösung finden können.

SvenLittkowski 2. Feb 2011 17:27

AW: Fehler: IF: Kein Teil eienr Menge (Bedingung)
 
Jens: ja, stimmt, es hat sich aber so entwickelt. Aber da ich die Lösung ja inzwischen habe, kann dieser Thread als "gelöst" markiert werden.

RGB-HexWerte: die sind verdreht, stimmt. Ich mache dies bewußt, um eigentlich Fremde etwas zu demotivieren, in der INI herumzuexperimentieren. :-)

Vielen Dank an Euch alle. Ihr habt mir alle bei der Lösung geholfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz