Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Turtle Grafik


Martello - Mi 25.03.09 00:05
Titel: Turtle Grafik
Hallo,

ich hab mal wieder ein Problem mit einer Kollision zw. Automatentext und Autorentext:

Ich fürchte die Zeile "Turtle1: TTurtle" darf ich nicht von Hand eintragen. Jedenfalls meckert der Compiler. Aber wie krieg ich dieses Objekt namens Turtle in mein Projekt. Die Unit Turtle im USES-Teil wird jedenfalls akzeptiert. Und ich gehe davon aus, daß die ok ist, wird schließlich viel in Schulen verwendet und ist frei verfügbar.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
unit Unit1;
interface
uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Spin, StdCtrls, ExtCtrls, Turtle;
type
  TForm1 = class(TForm)
    Turtle1: TTurtle;
    Panel1: TPanel;
    .....
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }

  end;

var
  Form1: TForm1;
implementation


ub60 - Mi 25.03.09 01:02

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
... Aber wie krieg ich dieses Objekt namens Turtle in mein Projekt.

Ich vermute mal, indem Du es unter private schreibst.

ub60


jaenicke - Mi 25.03.09 03:01

Wie kommst du eigentlich auf die Zeile? Was ich so im Internet sehe ist, dass du das nirgends deklarieren musst, sondern direkt nutzen kannst. :gruebel:

Wo gibts denn die Unit, die du da benutzt? Ich hatte jetzt keine Lust zu suchen und dann vielleicht eine ganz andere zu erwischen.

Private oder nicht macht dabei ja keinen Unterschied, ich kann theoretisch auch da etwas deklarieren, deshalb gibts keinen Fehler beim Kompilieren.


thepaine91 - Mi 25.03.09 09:45

Hi mich hätte mal interessiert was dein Compiler überhaupt sagt?

mfg nic


Martello - Mi 25.03.09 15:08

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie kommst du eigentlich auf die Zeile? Was ich so im Internet sehe ist, dass du das nirgends deklarieren musst, sondern direkt nutzen kannst. :gruebel:

Wo gibts denn die Unit, die du da benutzt? Ich hatte jetzt keine Lust zu suchen und dann vielleicht eine ganz andere zu erwischen.

Private oder nicht macht dabei ja keinen Unterschied, ich kann theoretisch auch da etwas deklarieren, deshalb gibts keinen Fehler beim Kompilieren.


Die UNIT gibts da: http://www.hsg-kl.de/faecher/inf/material/delphi/freiekomponenten/turtle.php
Es ist auch eine Beschreibung mitgeliefert, wie ich das als Komponente registrieren lassen kann - oder vielelicht muß :?: . Aber das klappt nicht unter 1.0, und mit TP6 krieg ich das auch nicht hin; geht dort wohl prinzipiell nicht :cry:

Es müsste doch aber möglich sein, eine UNIT, die gleichzeitig ein gültiges Objekt definiert, auch ohne Komponenten-Registrierung nutzen zu können. Bisher kenne ich nur die Verwendung von Komponenten (vis. Objekte) durch Erzeugung per Mausklick (aus der Komponentenpalette bezogen)

Den Code meines Thread-Starts habe ich aus einem Delphi-Kurs kopiert, der diese Turtle für Rekursionen benutzt. Die UNIT Turtle dürfte fehlerfrei sein. Aber wie kann ich sie nutzen?


Martello - Mi 25.03.09 15:16

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Hi mich hätte mal interessiert was dein Compiler überhaupt sagt?

mfg nic


Ich zeigt Dir die Meldung.

Mo.

Moderiert von user profile iconNarses: BMP->GIF, bitte nur komprimierte Bildformate verwenden!


Kha - Mi 25.03.09 15:40

Ein Fehler ist das ja eigentlich nicht (auch wenn's dransteht :mrgreen:). Wenn du die Deklaration, wie von ub60 vorgeschlagen, unter private verschiebst, sollte der Hinweis verschwinden.


ub60 - Mi 25.03.09 16:22

Wir kommen ja Schritt für Schritt weiter :lol:
Wenn es eine Komponente ist, sollte man sie dann auch noch im OnCreate-Ereignis des Formulars erstellen.

Delphi-Quelltext
1:
Turtle1:= TTurtle.Create(Form1);                    
... oder so

ub60


jaenicke - Mi 25.03.09 23:03

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Die UNIT gibts da: http://www.hsg-kl.de/faecher/inf/material/delphi/freiekomponenten/turtle.php
Es ist auch eine Beschreibung mitgeliefert, wie ich das als Komponente registrieren lassen kann - oder vielelicht muß :?: . Aber das klappt nicht unter 1.0, und mit TP6 krieg ich das auch nicht hin; geht dort wohl prinzipiell nicht :cry:
In Turbo Delphi kann man keine Komponenten installieren, das ist genau die Einschränkung. So funktionierts jedenfalls problemlos mit Turbo Delphi, hier mal die komplette Unit (die Unit Turtle musst du dem Projekt am besten einfach hinzufügen):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
unit Unit164;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Turtle, StdCtrls, ExtCtrls;

type
  TForm164 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    MyTurtle: TTurtle;
  public
    { Public declarations }
  end;

var
  Form164: TForm164;

implementation

{$R *.dfm}

procedure TForm164.Button1Click(Sender: TObject);
begin
  MyTurtle.FD(20);
end;

procedure TForm164.FormCreate(Sender: TObject);
begin
  MyTurtle := TTurtle.Create(Panel1);
  MyTurtle.Align := alClient;
  MyTurtle.Parent := Panel1;
end;

procedure TForm164.FormDestroy(Sender: TObject);
begin
  MyTurtle.Free;
end;

end.
Wenn du "MyTurtle: TTurtle;" oberhalb von private schreibst, dann musst du bei der Fehlermeldung aber auch nur auf Nein klicken, dann kompiliert das trotzdem (unter Turbo Delphi jedenfalls).

Aber an der Stelle fällt mir mal auf, dass die Ersteller dieser "didaktischen Komponenten" keinerlei Ahnung vom Programmieren haben...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    procedure CS;    { clear screen }
    procedure ST;    { show Turtle }
    procedure HT;    { hide Turtle }
    procedure PD;    { pen down }
    procedure PU;    { pen up }
    procedure FD( Value: real);         { step forward }
    procedure BK( Value: real);         { step backward }
    procedure LT( Value: real);         { left turn }
    procedure RT( Value: real);         { right turn }
So stehts in der Komponente...
Da müssen die schon ranschreiben was welche Prozedur macht. :autsch: :autsch: :autsch:
Eigentlich hätte das dem Autor zu denken geben sollen...

Naja, oder das ist als didaktisches Ratespiel ausgelegt. :autsch:


thepaine91 - Do 26.03.09 10:38

Naja man kann die Kommentare einfach als procedure Namen nehmen und dann hat sich das Problem soweit erledigt. =)
Aber der Sinn der Benamung bleibt aus. ( Würde ich sogar empfehlen die Namen zu ändern ist ja nur verwirrend)


Kha - Do 26.03.09 15:32

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Aber an der Stelle fällt mir mal auf, dass die Ersteller dieser "didaktischen Komponenten" keinerlei Ahnung vom Programmieren haben...
Vielleicht ist es auch einfach historisch gewachsen [http://en.wikipedia.org/wiki/Logo_(programming_language)#Syntax] ;) ? Für jemanden, der Turtle Graphics schon kennt, wäre eine LeftTurn-Prozedur wahrscheinlich so ungewohnt wie für uns ein *laugh out loud* :mrgreen: .


Zorro - Do 26.03.09 18:05

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Aber das klappt nicht unter 1.0, und mit TP6 krieg ich das auch nicht hin; geht dort wohl prinzipiell nicht :cry:
In Turbo Delphi kann man keine Komponenten installieren, das ist genau die Einschränkung.


Ahhhhhhhh....ich dachte "TP6" sei die Abkürzung für "Turbo-Pascal 6.0" (die vorletzte Version, die für DOS entwickelt wurde).

Greetz Zorro


jaenicke - Do 26.03.09 18:22

Ist es eigentlich auch, aber es gab soweit ich weiß auch Turbo Pascal 6.0 für Windows. Trotzdem habe ich auf einer Seite für Lehrer auch schon TP6 als Abkürzung für Turbo Delphi 2006 gesehen... vielleicht weil P fast wie D aussieht oder weils der Nachfolger ist... :autsch:

Turbo Pascal ist heutzutage aber genauso Quatsch wie Delphi 1.0 noch zu verwenden. Denn Delphi 1.0 kann nicht einmal 32-Bit Programme erstellen...

Deshalb ist es trotz der Einschränkung besser sich Turbo Delphi kostenlos herunterzuladen. Eigentlich auch an Schulen...
Eine Anleitung dafür hab ich hier gepostet, was die Aktivierung angeht passts nicht mehr 100%ig:
http://www.delphi-library.de/viewtopic.php?p=539975


Martello - Do 26.03.09 23:41

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Da müssen die schon ranschreiben was welche Prozedur macht. :autsch: :autsch: :autsch:
Eigentlich hätte das dem Autor zu denken geben sollen...

Naja, oder das ist als didaktisches Ratespiel ausgelegt. :autsch:


In Kursen, die mit den Komponeten arbeiten, ist es dann schon beschrieben. Und die Inhalte der UNITS, die als Klickkomponenten "registriert" werden, also ab da verborgen bleiben, sind ja nicht für uns Anfänger gedacht. Danke sehr für Deine Erklärung. Ich werde sie heute nicht mehr 100%ig nachvollziehen können. Das macht aber nichts. Vielmehr bin ich froh, zu erfahren, daß man Delphi auch durch TEXT "beherrschen" kann, jedenfalls irgendwann, später.

Als Umsteiger von TP ist mir das alles ein wenig unheimlich. Zwar darf ich alles lesen, und irgendwann sollte ich wohl auch kapieren, was der Automat da für mich dichtet, und ich bin ja eigentlich ganz froh, daß einfache KLicks soviel Schreibarbeit erledigen. Was mich aber bisher immer noch ärgert, ist die Tatsache, daß sich Delphi das Alleinschreibe-Vorrecht nimmt, und mich als Autor da raushält...und die lustige didaktische Turtle-Unit-Komponente, (ich habe sie mittlerweile in Delphi 7 :wink: ) "registriert", macht wirklich Spaß.

Aber ich bin schon darauf gespannt, sie entsprechend Deiner Anleitung auch in Turbo Delphi einzupflanzen...


jaenicke - Do 26.03.09 23:48

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Was mich aber bisher immer noch ärgert, ist die Tatsache, daß sich Delphi das Alleinschreibe-Vorrecht nimmt, und mich als Autor da raushält...
Wie meinst du das? Theoretisch kannst du alles auch selbst schreiben, es macht nur wenig Sinn. :mrgreen:


Martello - Do 26.03.09 23:52

user profile iconZorro hat folgendes geschrieben Zum zitierten Posting springen:

Ahhhhhhhh....ich dachte "TP6" sei die Abkürzung für "Turbo-Pascal 6.0" (die vorletzte Version, die für DOS entwickelt wurde).

Greetz Zorro


Sorry Zorro,

ich hab wohl viel zu lange mit TP6 programmiert - im Ernst, vielleicht länger als mach einer von euch Jüngeren alt ist!
Ich habe mich immer gegen OOP gesträubt, dieser ganze Firlefanz mit Mäusen und Rechteckfenstern, der mit TP5.5 vor vielen Jahrne losging... Aber Delphi macht Spaß, hätte nicht gedacht, daß Rechteckfensterbau sei einfach ginge...

Mit Delpi 1.0 habe ich nur wenige Wochen gelernt, nach Turbo Delphi 2006 (dieses war eigentlich mit "TP6" gemeint :oops: ) habe ich seit 2 Tagen Delphi 7; ich find's ok. Selbst das Buch "für Kids" ist als sehr knappe Einleitung nicht ganz unnütz :wink:


Martello - Do 26.03.09 23:58

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Was mich aber bisher immer noch ärgert, ist die Tatsache, daß sich Delphi das Alleinschreibe-Vorrecht nimmt, und mich als Autor da raushält...
Wie meinst du das? Theoretisch kannst du alles auch selbst schreiben, es macht nur wenig Sinn. :mrgreen:


Irgendwann werde ich es wohl kapieren; aber bisher mußte ich doch immer Komponenten zuvor per Klick generieren, um die "Verbindung zur Unit im Hintergrund" herzustellen. Zumindest habe ich das so wahrgenommen. Klar macht es keinen Sinn, alles selbst tippen zu wollen. Und wenn es so ist, daß man tatsächlich alles selbst schreiben könnte - umso besser. Das heißt ja nichts anderes, als daß man doch nicht so abhängig ist von der Maschine. Aber Achtung: Ich weiß von OOP so gut wie nichts. Und Delphi macht zunächst mal v.a. deshalb soviel Spaß, weil ich Pascal in langen Jahren ganz gut gelernt habe.


jaenicke - Fr 27.03.09 00:07

Wenn die Komponente visuell aufs Formular gezogen wird, dann passiert im Grunde nix anderes als was ich oben in dem Beispiel geschrieben habe. Nur dass das eben automatisch passiert, weil die Komponente auf dem Formular liegt und die Eigenschaften dazu in der Formulardefinitionsdatei (.dfm) stehen.

Das ist (ab Delphi 5 standardmäßig) auch nur eine Textdatei. Alles kannst du manuell schreiben, wenn du weißt was du tust. ;-) Delphi erzeugt nur automatisch diese Textdateien und verändert entsprechend deren Inhalt.


Martello - Fr 27.03.09 00:17

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
(die Unit Turtle musst du dem Projekt am besten einfach hinzufügen):


Als *.pas oder als *.dcu?
Und wo passiert das "einfache Hinzufügen"? In der Projektverwaltung? In der Version 1.0 war das alles noch selbsterklärend :wink:


jaenicke - Fr 27.03.09 00:18

Projekt --> Zum Projekt hinzufügen...
Und es ist die .pas Datei, die du hinzufügen solltest.

Du kannst auch den Pfad zu der Datei unter Tools --> Optionen --> Bibliothek Win32 oder so dem Suchpfad hinzufügen.

In beiden Fällen kannst du danach Turtle in die uses schreiben und benutzen. Du kannst die Datei auch ins Projektverzeichnis legen.


Martello - Fr 27.03.09 00:31

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Projekt --> Zum Projekt hinzufügen...
Und es ist die .pas Datei, die du hinzufügen solltest.



Ich habe Deine "unit164" als unit164.pas gespeichert und hinzugefügt.
Muß nur noch folgender Fehler behoben werden...


Delphi-Quelltext
1:
[Pascal Fehler] E1026 Datei nicht gefunden: 'Unit164.dfm'                    


Mo.


jaenicke - Fr 27.03.09 00:36

Die Unit brauchst du ja nicht, du musst nur den Quelltext daraus in deine eigene Unit kopieren. Ich wollte damit nur zeigen wie die Unit komplett aussieht, damit du es verstehst.

Das Hinzufügen usw. bezog sich auf die Unit Turtle, damit du diese einfach unter uses nutzen kannst.


Martello - Fr 27.03.09 00:52

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die Unit brauchst du ja nicht, du musst nur den Quelltext daraus in deine eigene Unit kopieren. Ich wollte damit nur zeigen wie die Unit komplett aussieht, damit du es verstehst.

Das Hinzufügen usw. bezog sich auf die Unit Turtle, damit du diese einfach unter uses nutzen kannst.


Die beiden

Turtle1: TTurtle;
Panel1: TPanel;

besitzen nun noch "keine entsprechende Komponenten".

Ich habe jetzt zwei UNITS im Projekt (U1 und Turtle).
Form1 ist leer. In Delphi 7 würde ich jetzt mit der Maus ein Turtle-Objekt aus der Komponentenliste auf Form1 ziehen. Dabei entstünde ein scrollbares Zeichenfeld mit einer Turtle genau in der Mitte.

Kann ich das in Turbo Delphi auch ohne Maus erreichen?

Mo.


jaenicke - Fr 27.03.09 01:27

Pack dir ein Panel auf das Formular, dazu noch einen Button. Jetzt gehst du in den Objektinspektor und klickst doppelt auf die Ereignisse OnCreate und OnDestroy deines Formulars und doppelt auf den Button.

Jetzt musst du nur noch den Quelltext wie in der von mir geposteten Unit kopieren ergänzen :mrgreen:.


Martello - Fr 27.03.09 13:10

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Pack dir ein Panel auf das Formular, dazu noch einen Button. Jetzt gehst du in den Objektinspektor und klickst doppelt auf die Ereignisse OnCreate und OnDestroy deines Formulars und doppelt auf den Button.

Jetzt musst du nur noch den Quelltext wie in der von mir geposteten Unit kopieren ergänzen :mrgreen:.


Das ist ja fast schon wie in den Delphi-Kinderlehrbüchern, die man nicht zu Unrecht auch "Klickanleitungen" oder "Mausklickrezepturen" nennen darf. Ein genialer Musiker hatte einmal seine "Haus- und Lebensregeln" mit dem Satz abgeschlossen: "Es ist des Lernens kein Ende." Bei Delphi lernt man tatsächlich erst einmal an der "richtigen Stelle zu klicken" und nach und nach dann auch - wenn man dabei bleibt -, was dabei eigentlich passiert.. :?