Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Operanden Typ?!


TheD - Mi 16.04.03 20:22
Titel: Operanden Typ?!
Hallöchen,


Quelltext
1:
2:
3:
4:
5:
6:
7:
  for iForCBPort := 0 to ComboBoxPort.Items.Count -1 do
  begin
    if not (ComboBoxPort.Items.Strings[iForCBPort] in ('COM1' or 'COM2' or 'COM3')) then
    begin
      ComboBoxPort.Items.Delete(iForCBPort);
    end; //if
  end; //IForCBPort

Damit möchte ich alle Einträge aus einer ComboBox löschen, die nicht COM1-COM3 heissen.

Aber ich erhalte ich der if-Zeile folgende Meldung:
[Error] Unit2.pas(70): Operator not applicable to this operand type

Was mach ich den falsch?


UGrohne - Mi 16.04.03 20:28

Probiers mal mit einem Vergleich mit

Quelltext
1:
['COM1', 'COM2','COM3']                    


wenn ich mich noch recht entisinne, komme nur grad net annen Delphi-Rechner ran.

Gruß


TheD - Mi 16.04.03 20:32

Dann heisst es:

[Error] Unit2.pas(70): Ordinal type required
[Error] Unit2.pas(70): Incompatible types: 'Integer' and 'String'

Weider in der if Zeile.


AndyB - Mi 16.04.03 22:17

Der in-Operator gibt nur für Sets. Und ein Set ist auf ordinale Typen (Char, Integer aller Art) beschränkt. Das was du vor hast geht aus diesem Grund nicht, weil ein String eben kein einfacher Typ ist sondern ein komplexer. Das Selbe Problem ergibt sich bei der case of-Anweisung.

Man kann sich jedoch eine Abhilfe verschaffen, indem man die offenen Array Parameter ausnützt.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function IsStrIn(const Value: string; const Args: array of string): Boolean;
var i: Integer;
begin
  Result := True;
  for i := 0 to High(Args) do
    if Args[i] = Value then Exit;
  Result := False;
end;


Quelltext
1:
2:
3:
begin
  if IsStrIn(ComPort, ['COM1', 'COM2', 'COM3']) then ...
end;


Christian S. - Mi 16.04.03 22:43

Zitat:
weil ein String eben kein einfacher Typ ist sondern ein komplexer
Besser beschrieben wäre es mit "kein aufzählbarer", komplex kann zu vieles heißen.


wulfskin - Do 17.04.03 13:26

Hallo TheD!

Hat zwar nix mit deinem Thema zu tun, aber du kannst nicht mit einer For-To-Do Schleife Items aus der Liste löschen, da, sobald ein Item gelöscht wurde, die Größe der Liste kleiner wird und du am Ende ein Fehler bekommst, da das Item X gar nicht mehr existiert.
Deshalb nimm für sowas einen While/Repeat-Schleife, bei der du I nur erhöhst, wenn das Item nicht gelöscht wurde.

Gruß wulfskin!


Christian S. - Do 17.04.03 14:13

@wulfskin: nicht ganz richtig. Du kannst Die FOR-Schleife beim höchsten Index starten lassen und bis 0 laufen lassen, dann geht das!


wulfskin - Do 17.04.03 15:49

Peter Lustig hat folgendes geschrieben:
@wulfskin: nicht ganz richtig. Du kannst Die FOR-Schleife beim höchsten Index starten lassen und bis 0 laufen lassen, dann geht das!
Stimmt ;)!


TheD - Fr 18.04.03 15:27

Oh, ja stimmt, hab da gar nciht dran gedacht. Danke für den Tip.
Frohe Ostern noch. ;)