Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Canvas zeichnet bei Integer, nicht bei Single (https://www.delphipraxis.net/100765-canvas-zeichnet-bei-integer-nicht-bei-single.html)

koisa 3. Okt 2007 16:33


Canvas zeichnet bei Integer, nicht bei Single
 
Ich habe folgendes Prolem:
Wenn die definierten Variablen als Integer angeben sind, wird das objekt gezeichnet,
sind diese Variablen jedoch als Single definiert, so wird nicht dargestellt.
Hätte evtl. jemand eine simple Idee??
Danke

DeddyH 3. Okt 2007 16:38

Re: Canvas zeichnet bei Integer, nicht bei Single
 
[ironie] Geht es etwas knapper? [/ironie]

Achja, willkommen in der DP :dp:

inherited 3. Okt 2007 16:43

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Ich nehme Fehlermöglichkeit C, hab ich jetzt was gewonnen? :stupid:


Da canvas IMHO keine Zeichenfunktion kennt die Single als Parameter erwartet oder akzeptiert, gehe ich davon aus dass du den Single irgendwie rundest, aber ohne Quelltext können wir hier nur raten woran es liegt.

malo 3. Okt 2007 16:43

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Du kannst einen Float-Datentyp ganz leicht durch ein Round casten.
Also
Delphi-Quellcode:
var i: integer;
    f: real;

...

i := Round(f);

koisa 3. Okt 2007 16:48

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Delphi-Quellcode:
procedure TFormPalettierung.SpeedButtonZeichnenClick(Sender: TObject);
var Breite, Hoehe :  Integer;
begin

 Lv := StrToFloat (EditLaenge.Text);
 Bv := StrToFloat (EditBreite.Text);


 repaint;
  begin
 if ComboBoxPalettenwahl.ItemIndex = 0 then Breite := 1200;
 if ComboBoxPalettenwahl.ItemIndex = 0 then Hoehe := 800;

 if ComboBoxPalettenwahl.ItemIndex = 1 then Breite := 1200;
 if ComboBoxPalettenwahl.Itemindex = 1 then Hoehe := 1000;


  end;

 begin
 imageDraufsicht.Canvas.rectangle(0,0, Breite div 5 , Hoehe div 5 );
  begin

  imagedraufsicht.canvas.MoveTo(0,Lv div 5 );
  imagedraufsicht.Canvas.LineTo(Lv div 5 ,Bv div 5);
  end;
  end;

end;

Dies funktioniert nicht, fehler wird in der Zeile "imagedraufsicht.canvas.MoveTo(0,Lv div 5 );" und der folgenden angezeigt, "Operator ist auf diesen Operandentyp nicht anwendbar". Die variable Lv und Bv sind vorher als Single definiert.

Wenn ich nur das Rectangle zeichnen lasse funktioniert es mit dem Typ Integer, wenn die variablen Breite bzw Höhe als SIngle def. sind geht dies auch nicht.

Danke

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

DeddyH 3. Okt 2007 16:52

Re: Canvas zeichnet bei Integer, nicht bei Single
 
div bezeichnet eine ganzzahlige Division, funktioniert daher auch nur mit ganzen Zahlen. Wie bereits angesprochen, könntest Du die Variablen vorher mit Round() runden.

Neutral General 3. Okt 2007 16:57

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Hi,

1. Bitte Quellcode formatieren
2. Bitte [.delphi][./delphi] tags benutzen (jeweils ohne Punkt.
3. Was sollen die ganzen begin und end;s im Code ? ...

Delphi-Quellcode:
procedure TFormPalettierung.SpeedButtonZeichnenClick(Sender: TObject);
var Breite, Hoehe : Integer;
begin
  Lv := StrToFloat(EditLaenge.Text);
  Bv := StrToFloat(EditBreite.Text);

  repaint; // wofür? lass es weg!

  if ComboBoxPalettenwahl.ItemIndex = 0 then
  begin
    Breite := 1200;
    Hoehe := 800;
  end;

  if ComboBoxPalettenwahl.ItemIndex = 1 then
  begin
    Breite := 1200;
    Hoehe := 1000;
  end;

  imageDraufsicht.Canvas.rectangle(0,0, Breite div 5, Hoehe div 5);
  imagedraufsicht.canvas.MoveTo(0,Round(Lv / 5));
  imagedraufsicht.Canvas.LineTo(Round(Lv / 5),Round(Bv / 5));
end;
Also die Canvas-Methoden wollen immer ein Single haben. div kannst du nur bei Integern benutzen und bei einer div-Operation kommt auch wieder ein Integer raus. Wenn du Singles (allg. Gleitkommazahlen) teilen willst musst du "/" benutzen. Jedoch ist es relativ unsinnig die Werte per StrToFloat aus dem Edit in Single Variablen zu lesen. Benutze Integer Variablen und StrToInt. Singles bringen dir hier gar nix.

Gruß
Neutral General

koisa 3. Okt 2007 17:56

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Ja danke schön nun geht es!

Eine kurze Frage noch: Kann man eine While Funktion in die Zeichenoperation einbinden??

In der Form:

while x<y do

canvas.....(x * p /0)


???

ulhau 3. Okt 2007 18:00

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Hi,

Divsion durch 0 könnte problematisch werden.

Tschüsss!

koisa 3. Okt 2007 18:04

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Das ist durchaus richtig. Gemeint war:

while x<y do

canvas.....(x * p , 0)

turboPASCAL 3. Okt 2007 18:05

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Zitat:

Zitat von ulhau
Hi,

Divsion durch 0 könnte problematisch werden.

Tschüsss!

p/0 ist nicht 0/p ;)
Zitat:

Zitat von koisa
Ja danke schön nun geht es!

Eine kurze Frage noch: Kann man eine While Funktion in die Zeichenoperation einbinden??

Ja, warum nicht. Kommt darauf an wie und was...

guidok 3. Okt 2007 18:19

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Zitat:

p/0 ist nicht 0/p
p/0 ist unendlich und nicht möglich (Division durch Null)
0/p ist Null.

Oder was wolltest du damit sagen?

koisa 3. Okt 2007 18:21

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Delphi-Quellcode:
procedure TFormPalettierung.SpeedButtonZeichnenClick(Sender: TObject);
var Breite, Hoehe :  Integer;   c,v,p : Single;
begin

 Lv := StrToFloat (EditLaenge.Text);
 Bv := StrToFloat (EditBreite.Text);
 Hv := StrToFloat (EditHoehe.Text);




 repaint;


 if ComboBoxPalettenwahl.ItemIndex = 0 then Breite := 1200;
 if ComboBoxPalettenwahl.ItemIndex = 0 then Hoehe := 800;

 if ComboBoxPalettenwahl.ItemIndex = 1 then Breite := 1200;
 if ComboBoxPalettenwahl.Itemindex = 1 then Hoehe := 1000;


  imageDraufsicht.Canvas.rectangle(0,0, Breite div 5 , Hoehe div 5 );



  begin
  repeat c:=c+1 until
  c+1 * Bv > Breite;
  if c+1 * Bv > Breite then c:= c-1;

  repeat v:=v+1 until
  v+1 * Lv > Hoehe;
  if v+1 * Lv > Hoehe then v:= v-1;
  end;

  while
  p<=c do
  begin
  imagedraufsicht.Canvas.MoveTo(round(p*Bv),0);
  imagedraufsicht.Canvas.LineTo(round(p*BV),round(v * Lv));

  end;

So, bei dieser Programmierung hängt sich das Programm beim zeichnen auf....

ulhau 3. Okt 2007 18:46

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Hi,

In der while schleife müsste sich c oder p auch ändern.

Tschüsss!

koisa 3. Okt 2007 18:54

Re: Canvas zeichnet bei Integer, nicht bei Single
 
anstatt der while eine repeat funktion??

repeat

imagedraufsicht.Canvas.MoveTo(round((p+1)*Bv),0);
imagedraufsicht.Canvas.LineTo(round((p+1)*BV),roun d(v * Lv));
until p+1=c ;

ulhau 3. Okt 2007 18:59

Re: Canvas zeichnet bei Integer, nicht bei Single
 
Hi,

nein in der while schleife c+1 oder p-1 denn die Schleife wird so lange ausgeführt wie c<=p ist. Also so lange wie sich nichts ändert.

Tschüsss!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr.

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