AGB  ·  Datenschutz  ·  Impressum  







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

Prozedur von Unit2 auf Unit1 ausführen?

Ein Thema von GroZ · begonnen am 27. Aug 2015 · letzter Beitrag vom 31. Aug 2015
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

AW: Prozedur von Unit2 auf Unit1 ausführen?

  Alt 27. Aug 2015, 21:30
OK. Das ist heftig, wenn du mit OOP noch gar nichts am Hut hattest. Weil hier kommt das Problem mit den Zeichenroutinen noch dazu und das ist nicht unbedingt trivial. Ich hätte als Einstieg einen Umrechner Celsius-Fahrenheit gefordert mit Klassen. Dann die Umstrukturierung Vererbung für andere Einheiten.

OK, hilft nichts. Ich gehe meinst wie folgt an so was ran:
Welche Infos braucht die Klasse?
Was soll die Klasse können? Hilfe: So bald ich keinen aussagekräftigen Klassenname finde, muss ich die Aufgaben aufteilen.
Eine Methode -> eine Aufgabe. Hilfe: Finde ich keinen aussagekräftigen Methodenbezeichern -> Aufgabe aufteilen auf mehrere Methoden.

Deine Unit 2 muss die Zeichenfläche kennen. Denn: Wohin mit meinem Gekrakel? Eine VCL Klasse (TPaintbox) übergeben wäre eine Lösung. Universeller wäre einen Canvas zu übergeben. Dann kannst du mit der Klasse auf alles Zeichnen, was ein Canvas hat.

Aber eventuell solltest du deinem Ausbilder zeigen, was du bisher hast und wie du dir denkst, dass es funktionieren soll. Dann wird er dir schon sagen, ob deine Vorstellung zielführend ist oder nicht.

Deswegen: Reden, reden, reden mit dem Ausbilder. Und du kannst auch ruhig sagen, dass du in einem Forum nachgefragt hast. Das zeigt, dass du dich damit beschäftigst.

Eine wirklich konkrete Hilfe konnte ich jetzt wohl nicht geben. Aber es ist wie mit Interpretationen im Deutsch Unterricht: Wenn du nicht schreibst, was der Lehrer erwartet, hast du verloren.

Vielleicht hilft auch ein lockeres UML Diagramm. Das könnt ihr zusammen erstellen und du programmierst es aus. Oder du erstellst ein UML Diagramm und zeigst es ihm. Dann kann er sagen, wo es schwierig wird und was besser wäre.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
GroZ

Registriert seit: 6. Jul 2015
Ort: Harz
167 Beiträge
 
Delphi 7 Personal
 
#12

AW: Prozedur von Unit2 auf Unit1 ausführen?

  Alt 28. Aug 2015, 09:10
Ich komm absolout nicht mehr weiter...
Meinen quellcode kennt ihr. ich bekomme soviele fehler >.<
Zum einen Wie kann ich ein Edit(Unit1) auf Unit2 ausführen. Also der soll zum erstellen des Rechteckes 2 Koordinaten nehmen können aus Edit Felder.
Delphi-Quellcode:
y2:= StrToInt(EditY.Text);
x2:= StrToInt(EditX.Text);
Aber das geht nicht. Hab das also immer noch nicht ganz verstanden wie ich die 2 Units verbinde..
Julian
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Prozedur von Unit2 auf Unit1 ausführen?

  Alt 28. Aug 2015, 09:23
Im Prinzip würde das so gehen: Form1.ExitXY.Text. ABER eben nur im Prinzip, denn dein Ansatz ist falsch, deswegen solltest du das nicht machen. Lass dir das alles bitte von deinem Ausbilder erläutern, denn wir können dir hier nicht in kurzen Worten eine jahrelange Ausbildung ersetzen.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Prozedur von Unit2 auf Unit1 ausführen?

  Alt 28. Aug 2015, 09:48
Wenn man dir sagt "Male etwas auf dieses Blatt Papier!" - musst du dann wissen, von welchem Baum das gemacht worden ist oder wer den Baum gefällt hat oder wie der verarbeitet wurde um diesem nachzukommen? Wohl eher nicht.

Wenn man dir sagt "Rechne 5 + 7!" - musst du dann wissen, woher diese Zahlen kommen um das zu berechnen? Wohl eher nicht.

Warum sollte es das Rechteck interessieren von welchem Edit-Feld diese Werte nun kommen?
Ermittel einfach die Werte aus dem Edit und übergebe diese Werte und versuche eben nicht das Rechteck fest an irgendein Edit-Feld zu binden. Genau dann bekommst du diese Probleme.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Chris211183

Registriert seit: 19. Sep 2013
Ort: Braunschweig
204 Beiträge
 
Delphi 6 Professional
 
#15

AW: Prozedur von Unit2 auf Unit1 ausführen?

  Alt 28. Aug 2015, 10:28
Er kennt die Paintbox nicht
wenn Du deine Klasse von TGraphicControl ableitest, sollter er die Kennen....


Welche Fehlermeldungen spuckt er denn wo aus ?
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Prozedur von Unit2 auf Unit1 ausführen?

  Alt 28. Aug 2015, 10:33
Er kennt die Paintbox nicht
wenn Du deine Klasse von TGraphicControl ableitest, sollter er die Kennen...
Wie soll denn bitteschön TGraphicControl helfen, damit die PaintBox bekannt ist?

Die PaintBox ist eine Instanz der Instanz Form1 .
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Chris211183

Registriert seit: 19. Sep 2013
Ort: Braunschweig
204 Beiträge
 
Delphi 6 Professional
 
#17

AW: Prozedur von Unit2 auf Unit1 ausführen?

  Alt 28. Aug 2015, 10:35
ich würde das eh nicht über die beiden Units machen, das kann man besser in eine machen und auf einer Form.

Hab den Code nicht ausprobiert...
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: Prozedur von Unit2 auf Unit1 ausführen?

  Alt 28. Aug 2015, 10:51
ich würde das eh nicht über die beiden Units machen, das kann man besser in eine machen und auf einer Form.
Wieso alles in einer Unit? Das ist doch Unfug.

Die Klassen stehen in einer Unit, die Form steht in einer Unit.

Die Instanzen der Klassen erzeugt man, indem man die benötigten Werte übergibt und eben nicht fest an irgendwelche Instanzen koppelt, um aus diesen Instanzen dann den Wert auszulesen.

Und für die Interaktion übergibt man die Instanz der minimal benötigten Klasse (hier ist ein TCanvas ausreichend):
Delphi-Quellcode:
{ Basisklasse zum Zeichnen }
TPaintObject = class abstract
protected
  procedure DoPaintOn( ACanvas: TCanvas ); virtual; abstract;
public
  procedure PaintOn( ACanvas: TCanvas );
end;

procedure TPaintObject.PaintOn( ACanvas: TCanvas );
begin
  DoPaintOn( ACanvas );
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Prozedur von Unit2 auf Unit1 ausführen?

  Alt 31. Aug 2015, 12:55
TPaintObject ist jetzt noch ziemlich abstrakt. Ich würde zumindest ein Property vorsehen, um ein Objekt ausblenden zu können, ohne es gleich zu löschen:
Delphi-Quellcode:
{ Basisklasse zum Zeichnen }
TPaintObject = class abstract
private
  FVisible: Boolean;
protected
  procedure DoPaintOn( ACanvas: TCanvas ); virtual; abstract;
public
  constructor Create;
  procedure PaintOn( ACanvas: TCanvas );
published
  property Visible: Boolean read FVisible write FVisible default True;
end;

constructor TPaintObject.Create;
begin
  inherited;
  FVisible := True;
end;

procedure TPaintObject.PaintOn( ACanvas: TCanvas );
begin
  if Visible then
    DoPaintOn( ACanvas );
end;
Eine Zeichnung besteht ja aus mehreren Objekten.
Dafür würde ich ein Klasse vereinbaren, die als Container für andere PaintObjekte dient und diese alle zeichnet.
Delphi-Quellcode:
TPaintObjectList = class(TPaintObject)
private
  FObjects: TObjectList;
protected
  procedure DoPaintOn( ACanvas: TCanvas ); override;
public
  constructor Create;
  destructor Destroy; override;
published
  property Objects: TObjectList read FObjects;
end;

constructor TPaintObjectList.Create;
begin
  inherited;
  FObjects := TObjectList.Create;
end;

destructor TPaintObjectList.Destroy;
begin
  FObjects.Free;
  inherited;
end;

procedure TPaintObjectList.DoPaintOn( ACanvas: TCanvas );
begin
  for i := 0 to FObjects.Count - 1 do
    TPaintObject(FObjects[i]).PaintOn(ACanvas);
end;
Da TPaintObjectList die Eigenschaft Visible von TPaintObject erbt, kann man so komplexe Teile einer Zeichnung (z.B. eine Ebene, oder ein Haus) ein- und ausblenden.
Aber zurück erst mal zum Rechteck:
Delphi-Quellcode:
TRechteck = class(TPaintObject)
private
  FPen: TPen;
  FRect: TRect;
protected
  procedure DoPaintOn( ACanvas: TCanvas ); override;
  procedure SetPen(AValue: TPen);
public
  constructor Create;
  destructor Destroy; override;
published
  property Pen: TPen read FPen write SetPen;
  property Rect: TRect read FRect write FRect;
end;

constructor TRechteck.Create;
begin
  inherited;
  FPen := TPen.Create;
end;

destructor TRechteck.Destroy;
begin
  FPen.Free;
  inherited;
end;

procedure TRechteck.SetPen(AValue: TPen);
begin
  FPen.Assigned(AValue);
end;

procedure TRechteck.DoPaintOn( ACanvas: TCanvas );
begin
  ACanvas.Pen := Pen;
  ACanvas.Rectangle(Rect);
end;
Damit haben wir das Verhalten einiger Klassen definiert, genug um damit in Form1 eine Zeichnung aus mehreren Rechtecken zu erstellen.
Das Erzeugen und Freigeben der Liste FPaintObjectList muss noch ergänzt werden:
Delphi-Quellcode:
uses
  {...}
  {Wir benutzen Objekte deren Klasse und Verhalten in Unit2 deklariert wurde:}
  Unit2;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    PaintBox1: TPaintBox;
    procedure PaintBox1Paint(Sender: TObject);
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private-Deklarationen }
    {Liste aller zu zeichnenden Objekte, im OnCreate erzeugen und im OnDestroy freigeben !}
    FPaintObjectList: TPaintObjectList;
    {das letzte Zeichenobjekt in Bearbeitung}
    FPaintObject: TPaintObject;
    procedure BewegeRechteck(ARechteck: TRechteck; x1, y1, x2, y2: Integer);
    function NeuesRechteck(x1, y1, x2, y2: Integer): TRechteck;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  Paintbox1.Canvas.Brush.Color := clWhite;
  Paintbox1.Canvas.FillRect(Paintbox1.ClientRect);

  FPaintObjectList.PaintOn(Paintbox1.Canvas);
end;

procedure TForm1.BewegeRechteck(ARechteck: TRechteck; x1, y1, x2, y2: Integer);
begin
  ARechteck.Rect := TRect(x1, y1, x2, y2);
  PaintBox1.Invalidate;
end;

function TForm1.NeuesRechteck(x1, y1, x2, y2: Integer): TRechteck;
begin
  Result := TRechteck.Create;
  BewegeRechteck(Result, x1, y1, x2, y2);
end;

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FPaintObject := NeuesRechteck(x, y, x, y);
  FPaintObjectList.Objects.Add(FPaintObject);
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  r: TRect;
begin
  if FPaintObject is TRechteck then
  begin
    r := TRechteck(FPaintObject).Rect;
    BewegeRechteck(TRechteck(FPaintObject), r.Lect, r.Top, x, y);
  end;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FPaintObject := nil;
end;

end.
Das Ganze ist natürlich nicht perfekt und auch nicht getestet, sondern soll erst mal dem Verständnis dienen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 08:19 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