Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   In Image einer anderen Unit zeichnen (https://www.delphipraxis.net/180386-image-einer-anderen-unit-zeichnen.html)

Riclem 16. Mai 2014 16:07

Delphi-Version: 5

In Image einer anderen Unit zeichnen
 
Hallo,

ich habe aktuell zwei Probleme.

1. Ich bin gerade dabei, per Button-procedure einen Graphen in das Image einer anderen Unit zu zeichnen.
Delphi-Quellcode:
Form1.Image1.Canvas.Pixels[round((x*prop)+8), round(Image1.Height-9-(y*prop))]:=clblack;
Das ist die "zeichnende Befehlszeile". Könnt ihr mir sagen, woran es liegt?
Die Unit ist auch eingebunden (und die Form heißt auch Form1):
Delphi-Quellcode:
implementation

uses Unit1;
2. Ich mache hier einen Timer, um zu überprüfen, ob eine Zahl zwischen 1 und 90 eingegeben wird. Jedoch erscheint "incompatible types" und
das then wird rot hinterlegt. Kann mir auch da jmd. helfen? Danke, wär supernett.
Delphi-Quellcode:
   procedure TForm2.PruefTimer(Sender: TObject);
begin
  if 0<StrToFloat(Winkel.text)<90
    then
      begin
        Aussage.Color:=clRed;
        Aussage.Caption:='Alle Eingaben sind korrekt';
      end;
Schon mal großes Danke im Voraus!

himitsu 16. Mai 2014 18:49

AW: In Image einer anderen Unit zeichnen
 
Zitat:

Zitat von Riclem (Beitrag 1259078)
Könnt ihr mir sagen, woran es liegt?

Nein, denn du hast vergessen zu sagen was eigentlich los ist.

Also was passiert denn nun? (oder nicht)



Und eine Frage pro Thread.
Aber klammer das mal und dann kommst du selber drauf, warum das so nicht gehen kann.
Delphi-Quellcode:
if (0 < DeinFloat) < 90 then

if EinBoolean < 90 then

Popov 16. Mai 2014 19:18

AW: In Image einer anderen Unit zeichnen
 
Bei dem ersten "Problem" weiß ich eigentlich auch nicht was den Problem ist. Aber mal kurz zu der Zeile:
Delphi-Quellcode:
Form1.Image1.Canvas.Pixels[1, 1] := clBlack;
Image hat eigentlich kein eigenes Canvas, es greift auf das Canvas der Bitmap zu, bzw. konkret auf die Canvas von Image.Picture.Bitmap.Canvas. Die und die Canvas von Image.Canvas sind gleich. Gibt es diese Canvas nicht, gibt es Probleme. Wann gibt es die Canvas nicht? Wenn in der Image z. B. ein Jpeg, Gif, Png, Ico o. ä. geladen sind. Auch ist die Canvas eigentlich immer so groß wie die Bitmap, sie richtet sich nicht nach der Image.

Was den Winkel angeht, dafür brauchst du keinen Timer. Im Grunde wird das im Ereignis OnExit der Edit kontrolliert. Willst du das stets aktuell haben, kannst du es in OnChange machen.

Riclem 16. Mai 2014 19:47

AW: In Image einer anderen Unit zeichnen
 
Die Sache mit dem Timer hat dann irgendwie geklappt, als ich es als zwei Bedingungen formuliert habe und die 0 bei dem Vergleich "vorne" geschrieben habe. ^^ Wie funktioniert das OnChange? (Sry, ich bin erst in der zehntenKlasse, das hatte ich noch nicht)

Bei dem "Pixelzeichnen" habt ihr natürlich recht, ich hab vergessen, das Problem zu sagen :oops:
Es ist so, dass er ausgibt, dass er Image1 nicht finden kann/es nicht existiert. Deshalb hatte ich das Einbinden der Unit dazugeschrieben, um zu zeigen, dass ich das nicht vergessen hab. Unsere Lehrer haben uns bei Delphigrafik gesagt, dass wir in Images zeichnen sollen.. Ist es schlimm, dass das Image nicht so direkt ein eigenes Canvas hat oder ist das nur Formsache?

Da der Text etwas unstrukturiert ist, hab ich mal die Teile unterstrichen, bei denen ich für eure Hilfe sehr dankbar wäre.

Popov 16. Mai 2014 20:00

AW: In Image einer anderen Unit zeichnen
 
Was du gemacht hast ist eigentlich schon richtig. Mit
Delphi-Quellcode:
Form1.Image1.Canvas.Pixels...
sagst du, dass sich die Image1 auf Form1 befindet.

Der Fehler liegt somit vermutlich in der Sichtbarkeit, und die ist u. a. davon abhängig wo die Image1 deklariert- und wo die Unit1 eingebunden wurde. Ich gehe mal davon aus, dass die Image1 auf der Form1 einfach abgelegt wurde. Die Einbindung der Unit scheint auch richtig zu sein. Was bisher gepostet wurde ist nicht falsch. Ich denke mir du mußt mehr veröffentlichen.

Was die OnChange angeht, das Edit-Feld auswählen, im Objekt-Inspektor auf Ereignisse gehen und dort doppelt in OnChange klicken.

//EDIT:

Das mit TImage und Canvas ist eigentlich keine Formsache. Wie schon gesagt kann TImage verschiedene Bild-Typen darstellen, darunter TBitmap. Eigentlich hat TImage keine eigene Canvas, bedient sich aber der Canvas von TBitmap, der der Grafik-Typ TBitmap ist.

Es mag also so sein, dass bei einer leeren TImage beim ersten Zugriff auf Canvas eine Bitmap erstellt wird, so dass man drauf zeichnen kann. Ich persönlich halte das für eine wackele Angelegenheit. Ändern sich die Einstellungen schon gibt es Probleme.

Perlsau 16. Mai 2014 20:12

AW: In Image einer anderen Unit zeichnen
 
Zitat:

Zitat von Riclem (Beitrag 1259102)
Wie funktioniert das OnChange?

OnChange wird ausgelöst bei Änderungen durch Benutzereingaben. Erstelle eine Ereignisbehandlung (Doppelklick auf OnChange im OI) und schreibe in den Methodenrumpf deine Anweisungen.

Zitat:

Zitat von Riclem (Beitrag 1259102)
Sry, ich bin erst in der zehntenKlasse, das hatte ich noch nicht

Ach du Armer, mir kommen die Tränen :cry: Das, was du nicht in der Schule lernst, mußt du dir selbst beibringen. Es gibt zahlreiche gute Tutorials. Auch die Online-Hilfe bietet immer wieder gute Hinweise über Funktionsweisen z.B. von Properties und Ereignissen. Wenn du dagegen nur daran interessiert bist, das, was du in der Schule lernst, zu machen, dann darfst du auch nicht darüber hinausgehen und Sachen programmieren wollen, die du nicht in der Schule lernst. Ich hab auch nichts davon in der Schule gelernt und mir alles selbst beigebracht.

Zitat:

Zitat von Riclem (Beitrag 1259102)
Bei dem "Pixelzeichnen" habt ihr natürlich recht, ich hab vergessen, das Problem zu sagen :oops:

Hellsehen hat mit Programmieren fast nichts zu tun ... abgesehen von Delphi-Foren natürlich, wenn man die Probleme der Hilfesuchenden erraten soll :lol:

Zitat:

Zitat von Riclem (Beitrag 1259102)
Es ist so, dass er ausgibt, dass er Image1 nicht finden kann/es nicht existiert. Deshalb hatte ich das Einbinden der Unit dazugeschrieben, um zu zeigen, dass ich das nicht vergessen hab. Unsere Lehrer haben uns bei Delphigrafik gesagt, dass wir in Images zeichnen sollen.. Ist es schlimm, dass das Image nicht so direkt ein eigenes Canvas hat oder ist das nur Formsache?

Wieso schreibst du die Methode, die das Image bearbeitet, nicht einfach in die dazugehörige Unit und rufst diese Methode dann von deinem ButtonClick oder deiner OnChange-Behandlung aus auf? Benötigte Werte übergibst du dann einfach als Parameter.

Riclem 17. Mai 2014 08:01

AW: In Image einer anderen Unit zeichnen
 
Zitat:

Zitat von Perlsau (Beitrag 1259104)
Ach du Armer, mir kommen die Tränen :cry: Das, was du nicht in der Schule lernst, mußt du dir selbst beibringen. Es gibt zahlreiche gute Tutorials. Auch die Online-Hilfe bietet immer wieder gute Hinweise über Funktionsweisen z.B. von Properties und Ereignissen.

Bzgl. der Sache mit dem Canvas-Zeichnen habe ich schon online nach Lösungen geschaut. Bei OnChange hast du natürlich recht, da hätte ich selbst nachschauen können..das war Faulheit :-(
Zitat:

Zitat von Perlsau
Wieso schreibst du die Methode, die das Image bearbeitet, nicht einfach in die dazugehörige Unit und rufst diese Methode dann von deinem ButtonClick oder deiner OnChange-Behandlung aus auf? Benötigte Werte übergibst du dann einfach als Parameter.

Weil ich die Lösung eigentlich auch nicht soo schlecht finde, weil ich (trotz Internetrecherche) globale Procedures irgendwie nicht gebacken bekam...

Zitat:

Zitat von Povov
Ich denke mir du mußt mehr veröffentlichen.

Ich habe 2 Units(Unit1, PEG) und 2 Forms(Form1, Form2). Unit1 gehört zu Form1, PEG gehört zu Form2. Form2 ist die MainUnit, die ruft dann per
Delphi-Quellcode:
Form1.Show;
die zweite Form auf. Das klappt auch. Wie oben schon gezeigt, ist Unit1 auch in PEG eingebunden. (Muss man nur alle Units in die Main Unit einbinden oder auch die Main Unit in allen anderen nochmal?)

Die Zeile
Delphi-Quellcode:
Form1.Image1.Canvas.Pixels[1, 1] := clBlack;
(das steht in PEG und bezieht sich auf Unit1/Form1) ist in eine "repeat until"-Schleife eingebunden.
In einer procedure, die in der Implementation von PEG definiert wurde, klappt das aber, dort findet er das Canvas:
Delphi-Quellcode:
with Form1.Image1.Canvas do
    begin
      //Achsen zeichnen
      Pen.Color:=clBlack;
      MoveTo(8,Form1.Image1.Height-9);
      LineTo(Form1.Image1.Width-9,Form1.Image1.Height-9);
      MoveTo(8,Form1.Image1.Height-9);
      LineTo(8,8);
      //Pfeilenden einzeichnen
      Pixels[7,9]:=clBlack; //y-Achse
      Pixels[6,10]:=clBlack;
      Pixels[5,11]:=clBlack;
      Pixels[4,12]:=clBlack;

Riclem 18. Mai 2014 14:13

Hat sich geklärt..
 
Es war ein Fehler der Art :wall:

Delphi-Quellcode:
Form1.Image1.Canvas.Pixels[round((x*prop)+8), round(Image1.Height-9-(y*prop))]:=clblack;
Bei Angabe der y-Koordinate fehlte das "Form1." und ich habe nur vorn gesucht -.-


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 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