Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Operator is auf diesen Operandentyp nicht anwendbar (https://www.delphipraxis.net/115958-operator-auf-diesen-operandentyp-nicht-anwendbar.html)

Tempest08 20. Jun 2008 14:56


Operator is auf diesen Operandentyp nicht anwendbar
 
Bei im Betreff genannter Fehlermeldung spricht der Marker auf unten mit "[_]" markierte Stelle

Delphi-Quellcode:
type
  TZeiger =^TSportler;
  TSportler = record
                name : string[50];
                zeit : real;
                next : TZeiger;
              end;


procedure TForm1.Loeschen1Click(Sender: TObject);
var handle: string[50];
    time: real;
    vor: TZeiger;

begin
  handle:= StringGrid1.Cells[x, y];
  time:= StrToFloat(StringGrid1.Cells[x+1, y]);
  sportler:= schnellster;
  while handle <> sportler^.name and sportler^.zeit <>[_] time // Fehlermeldung
...
Weiß jemand woran es liegen könnte? :\

Neutral General 20. Jun 2008 14:59

Re: Operator is auf diesen Operandentyp nicht anwendbar
 
Hi,

Du musst die einzelnen Bedingungen in Klammern setzen:

Delphi-Quellcode:
if (a = b) and (not c) then
genauso halt auch bei while und repeat...

In deinem Quelltext

Delphi-Quellcode:
sportler^.name and sportler^.zeit
denkt der Compiler du willst

sportler^.name AND sportler^.zeit

rechnen, also diese beiden Werte miteinander verknüpfen. Und das funktioniert bei Strings eben nicht, weshalb angezeigt wird, das man das and nicht im Bezug auf Strings benutzen kann.

Gruß
Neutral General

Tempest08 20. Jun 2008 15:01

Re: Operator is auf diesen Operandentyp nicht anwendbar
 
..... danke

RavenIV 20. Jun 2008 15:31

Re: Operator is auf diesen Operandentyp nicht anwendbar
 
Das AND wiegt stärker als das <>.
Daher muss man Klammern setzen.

if (a <> b) AND (c <> d) then

Siehe auch den Abschnitt "Operatoren" in der Delphi-Hilfe.

Tempest08 22. Jun 2008 17:48

Re: Operator is auf diesen Operandentyp nicht anwendbar
 
Nochmal ich... Kann mir jemand erklären, warum nach folgendem Quellcode einschließlich oben geschriebener Deklaration nichts im StringGrid ausgegeben wird??
Delphi-Quellcode:

procedure TForm1.FormActivate(Sender: TObject);
var n: integer;
begin
  vor:= nil;
  Schnellster:= nil;
  gespeichert:= false;
  with StringGrid1 do begin
    ColCount:= 3;
    RowCount:= 31;
    Cells[1, 0]:= 'Name';
    Cells[2, 0]:= 'Zeit';
  end;
  anzahl:= 0;
  for n:= 1 to 30 do StringGrid1.Cells[0, n]:= IntToStr(n);
end;


procedure TForm1.Einfuegen1Click(Sender: TObject);
begin
  form2.show;
  ausgeben;
end;


procedure TForm1.Ausgeben;
var yPos: integer;
begin
  for yPos:= 1 to 30 do begin
    StringGrid1.Cells[1, yPos]:= '';
    StringGrid1.Cells[2, yPos]:= '';
  end;
  sportler:= schnellster;
  ypos:= 1;
  while sportler <> nil do begin
    StringGrid1.Cells[1, yPos]:= sportler^.name;
    StringGrid1.Cells[2, yPos]:= FloatToStr(sportler^.zeit);
    sportler:= sportler^.next;
    ypos:= ypos+1;
  end;
end;

   
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  y:= ARow;
end;


procedure TForm1.Loeschen1Click(Sender: TObject);
var handle: string[50];
    time: real;
begin
  handle:= StringGrid1.Cells[1, y];
  time:= StrToFloat(StringGrid1.Cells[2, y]);
  sportler:= schnellster;
  while (handle <> sportler^.name) and (sportler^.zeit <> time)
    do begin
      vor:= sportler;
      sportler:= sportler^.next;
    end;
  vor^.next:= sportler^.next;
  dispose(sportler);
  ausgeben;
end;


procedure TForm2.EinfuegenClick(Sender: TObject);
var neu: TZeiger;
begin
  new(neu);
  neu^.name:= NameEd.Text;
  neu^.zeit:= StrToFloat(ZeitEd.Text);
  if schnellster = nil
    then schnellster:= neu
    else begin
      neu^.next:= schnellster;
      schnellster:= neu;
    end;
  gespeichert:= false;
  Form2.hide;
end;

DeddyH 22. Jun 2008 17:50

Re: Operator is auf diesen Operandentyp nicht anwendbar
 
Tja, was klickst Du denn, wenn nichts ausgegeben wird?

Tempest08 22. Jun 2008 18:13

Re: Operator is auf diesen Operandentyp nicht anwendbar
 
Liste der Anhänge anzeigen (Anzahl: 1)
den Einfügen-Button (im Anhang zu sehen)

Edit:

Ich habe den Fehler vermutlich gefunden, allerdings tut sich ein neues Problem auf

Delphi-Quellcode:
procedure TForm2.EinfuegenClick(Sender: TObject);
var neu: TZeiger;
begin
  new(neu);
  neu^.name:= NameEd.Text;
  neu^.zeit:= StrToFloat(ZeitEd.Text);
  if schnellster = nil
    then schnellster:= neu
    else begin
      neu^.next:= schnellster;
      schnellster:= neu;
    end;
  gespeichert:= false;
  form1.ausgeben;      // muss hier stehen und nich in Einfuegen1Click, da sonst nichts ausgegeben wird
  Form2.visible:= false;
end;
Leider bekomme ich jetzt einen EAccessViolation Fehler an eben der Stelle, die mit // beschriftet ist

DeddyH 22. Jun 2008 18:26

Re: Operator is auf diesen Operandentyp nicht anwendbar
 
Ich bin im Moment zu blau, um mir das im Einzelnen anzuschauen, aber lies mal hier: http://www.delphipraxis.net/internal...t.php?t=132884

Tempest08 22. Jun 2008 18:29

Re: Operator is auf diesen Operandentyp nicht anwendbar
 
Ich hab Zeigerverkettungen grundsätzlich drauf, ich knobel da jetzt schon recht lang dran und finde einfach nicht das Problem...

DeddyH 22. Jun 2008 18:30

Re: Operator is auf diesen Operandentyp nicht anwendbar
 
Wie gesagt, heute nicht mehr, sry, da können Andere ran.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 Uhr.
Seite 1 von 2  1 2      

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