AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

In Image einer anderen Unit zeichnen

Ein Thema von Riclem · begonnen am 16. Mai 2014 · letzter Beitrag vom 18. Mai 2014
Antwort Antwort
Riclem

Registriert seit: 16. Mai 2014
8 Beiträge
 
#1

In Image einer anderen Unit zeichnen

  Alt 16. Mai 2014, 16:07
Delphi-Version: 5
Hallo,

ich habe aktuell zwei Probleme.

1. Ich bin gerade dabei, per Button-procedure einen Graphen in das Image einer anderen Unit zu zeichnen.
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!

Geändert von Riclem (16. Mai 2014 um 16:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#2

AW: In Image einer anderen Unit zeichnen

  Alt 16. Mai 2014, 18:49
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: In Image einer anderen Unit zeichnen

  Alt 16. Mai 2014, 19:18
Bei dem ersten "Problem" weiß ich eigentlich auch nicht was den Problem ist. Aber mal kurz zu der Zeile: 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.
  Mit Zitat antworten Zitat
Riclem

Registriert seit: 16. Mai 2014
8 Beiträge
 
#4

AW: In Image einer anderen Unit zeichnen

  Alt 16. Mai 2014, 19:47
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
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: In Image einer anderen Unit zeichnen

  Alt 16. Mai 2014, 20:00
Was du gemacht hast ist eigentlich schon richtig. Mit 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.

Geändert von Popov (16. Mai 2014 um 20:06 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

AW: In Image einer anderen Unit zeichnen

  Alt 16. Mai 2014, 20:12
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.

Sry, ich bin erst in der zehntenKlasse, das hatte ich noch nicht
Ach du Armer, mir kommen die Tränen 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.

Bei dem "Pixelzeichnen" habt ihr natürlich recht, ich hab vergessen, das Problem zu sagen
Hellsehen hat mit Programmieren fast nichts zu tun ... abgesehen von Delphi-Foren natürlich, wenn man die Probleme der Hilfesuchenden erraten soll

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.
  Mit Zitat antworten Zitat
Riclem

Registriert seit: 16. Mai 2014
8 Beiträge
 
#7

AW: In Image einer anderen Unit zeichnen

  Alt 17. Mai 2014, 08:01
Ach du Armer, mir kommen die Tränen 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 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 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 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 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;

Geändert von Riclem (17. Mai 2014 um 11:36 Uhr)
  Mit Zitat antworten Zitat
Riclem

Registriert seit: 16. Mai 2014
8 Beiträge
 
#8

Hat sich geklärt..

  Alt 18. Mai 2014, 14:13
Es war ein Fehler der Art

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 -.-
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 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