Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Komponente für "Brainstorm"-Diagramme gesucht (https://www.delphipraxis.net/25978-komponente-fuer-brainstorm-diagramme-gesucht.html)

Tyler 16. Jul 2004 13:21

Re: Komponente für "Brainstorm"-Diagramme gesucht
 
hehe, muss ich wohl noch mal genauer lesen ^^

Naja, aber ich sag mal so: Selber machen, macht ja auch mehr Spass. Mal sehen wie ich damit klar komme, ansonsten werd ich auf die fertige Komponente zurückgreifen. Aufjedenfalll gut zu wissen, das es sowas gibt :D

Nikolas 16. Jul 2004 15:46

Re: Komponente für "Brainstorm"-Diagramme gesucht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Was habt ihr denn gegen den Vorschlag: Mit etwas Denkarbeit hab ich ganz schnell so eine Linie gebaut: (Siehe Anhang)
Benutzte Procedure:
Delphi-Quellcode:
procedure TForm1.Paint(x,y: integer; col: TColor; img: TImage);
var
xm: integer;
begin
// 250 = img.Width div 2
// 150 = img.Heigth div 2

xm:=(250-x) div 2 ;
with img.Canvas do
begin
Pen.Color:=col;
moveto(250,150);    // Mitte des images
lineto(250-xm,150); // Waagrecht
lineto(250-xm,y);   // Senkrecht
lineto(x,y);        // nochmal waagrecht
end;
end; // of paint

Rackergen2 16. Jul 2004 16:38

Re: Komponente für "Brainstorm"-Diagramme gesucht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Soweit schonmal geil... Jetzt müsste man nur noch einbauen, dass der auch mal vertikal anfängt...

Delphi-Quellcode:
procedure TForm1.Paint(x1, y1, x2, y2: integer; col: TColor; img: TImage);
var
  xm, ym: integer;
begin
  with img.Canvas do
  begin
    Pen.Color:=col;
    moveto(x1,y1);    // Mitte des images
    if abs(x1-x2)>abs(y1-y2) then
    begin
      xm:=(x1-x2) div 2 ;
      lineto(x1-xm,y1); // Waagrecht
      lineto(x1-xm,y2);   // Senkrecht
      lineto(x2,y2);        // nochmal waagrecht
    end
    else
    begin
      ym:=(y1-y2) div 2 ;
      lineto(x1,y1-ym); // Senkrecht
      lineto(x2,y1-ym);   // Waagerecht
      lineto(x2,y2);        // nochmal Senkrecht
    end;
  end;
end; // of paint
Kommt das hin? Ich konnte es leider nicht testen...
EDIT: getestet, verändert, läuft super

Nebenbei, wie hast du die Koordinaten beim Klick ausgelsen? (EDIT: hat sich erledigt)

Nikolas 16. Jul 2004 16:44

Re: Komponente für "Brainstorm"-Diagramme gesucht
 
Das sollte aber kein wirkliches Problem darstellen, oder? Skizze machen und dann kurz nachdenken.
Der Code ist fast exakt der gleiche wie der schon gepostete, also selbst ist der Programmierer :coder:

Eisenherz 16. Jul 2004 16:47

Re: Komponente für "Brainstorm"-Diagramme gesucht
 
Zitat:

Zitat von Toxman
Was habt ihr denn gegen den Vorschlag

Eigentlich nichts. Es dürfte nur am eigentlichen Problem vorbei gehen.
Zitat:

Zitat von Tyler
Ausserdem sollten sie, wenn ich die Panels bewege, an den Panels kleben bleiben und entsprechend ihre Länge ändern.

Daraus schließe ich, dass die "Panels" bewegt werden sollen und ich vermute, dass soll nicht durch das Programm, sondern durch den Anwender geschehen. Tyler will also einen Editor für Brainstorm-Diagramme erstellen.
Und wie das bei Editoren so üblich ist, werden die Wünsche nach der Bedienbarkeit explodieren. Wenn man ein "Panel" verschieben kann, dann dürfte schnell der Wunsch entstehen mehrere "Panels" auf einmal verschieben zu können. Dann will der Anwender bestimmt auch die Verbindungslinien manipulieren können. Da die Diagramme bestimmt größer werden sollen als der zur Verfügung stehende Bildschirmplatz muss man Scrollen können. Dann ist folglich der nächste Wunsch, dass man Zoomen kann. Bestimmt will man das Diagramm nicht nur auf dem Bildschirm bewundern, sondern auch drucken können. Und wem ist es noch nicht passiert, dass er aus Versehen etwas gelöscht hat. Dann flucht man über die Programme die kein Undo zur Verfügung stellen.

Es geht also um viel mehr als nur ein paar waagerechte und senkrechte Linien zu zeichnen.

Nikolas 16. Jul 2004 18:00

Re: Komponente für "Brainstorm"-Diagramme gesucht
 
Ja und? Diese ganzen Eigenschaften lassen sich ja auch realisieren. Bis jetzt war nur eine Möglichkeit gesucht, solche Linien zu zeichnen. Was jetzt damit gemacht wird, ist doch eigentlich wieder Tyler's Sache.

Tyler 16. Jul 2004 18:15

Re: Komponente für "Brainstorm"-Diagramme gesucht
 
@Eisenherz

hehe... stimmt natürlich, früher oder später steigen dann die Ansprüche. Aber mühsam ernährt sich das Eichhörnchen... ich fang erstmal klein an. Realisieren lässt sich das ja dann immer noch :)

Aber erstmal folgendes, achtung, viel Code ^^

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  x1, y1, x2, y2 : Integer;
  xdif1, ydif1 : Integer;
  xdif2, ydif2 : Integer;

begin

//  PaintBox1.Canvas.Brush.Color := Form1.Color;
//  PaintBox1.Canvas.Rectangle(-1,-1,Form1.Width,Form1.Height);
  PaintBox1.Canvas.Pen.Color := Form1.Color;
  PaintBox1.Canvas.MoveTo(x1_,y1_);
  PaintBox1.Canvas.LineTo(x1_,ydif1_);
  PaintBox1.Canvas.MoveTo(x2_,y2_);
  PaintBox1.Canvas.LineTo(x2_,ydif1_);
  PaintBox1.Canvas.MoveTo(x1_,ydif1_);
  PaintBox1.Canvas.LineTo(x2_,ydif1_);

  PaintBox1.Canvas.LineTo(xdif1,y1);
  PaintBox1.Canvas.LineTo(xdif1,y2);
  PaintBox1.Canvas.MoveTo(xdif1,y1);
  PaintBox1.Canvas.LineTo(xdif1,y2);

  if (Panel1.Top + Panel1.Height >= Panel2.Top) then
  begin
    x1 := Panel1.Left + Panel1.Width;
    y1 := Panel1.Top + (Panel1.Height div 2);
    x2 := Panel2.Left;
    y2 := Panel2.Top + (Panel2.Height div 2);

    ydif1 := Panel2.Top - ((Panel2.Top - (Panel1.Top +  Panel2.Height)) div 2);
    xdif1 := x1 + (Panel2.Left - ((Panel2.Left - Panel1.Left + Panel1.Width) div 2));

    PaintBox1.Canvas.Pen.Color := clRed;
    PaintBox1.Canvas.MoveTo(x1,y1);
    PaintBox1.Canvas.LineTo(xdif1,y1);
    PaintBox1.Canvas.MoveTo(x2,y2);
    PaintBox1.Canvas.LineTo(xdif1,y2);
    PaintBox1.Canvas.MoveTo(xdif1,y1);
    PaintBox1.Canvas.LineTo(xdif1,y2);
  end else
  begin
    x1 := Panel1.Left + (Panel1.Width div 2);
    y1 := Panel1.Top + (Panel1.Height);
    x2 := Panel2.Left + (Panel2.Width div 2);
    y2 := Panel2.Top;
    ydif1 := Panel2.Top - ((Panel2.Top - (Panel1.Top +  Panel2.Height)) div 2);
    xdif1 := (Panel2.Left - Panel1.Left + Panel1.Width) div 2;

    PaintBox1.Canvas.Pen.Color := clBlue;
    PaintBox1.Canvas.MoveTo(x1,y1);
    PaintBox1.Canvas.LineTo(x1,ydif1);
    PaintBox1.Canvas.MoveTo(x2,y2);
    PaintBox1.Canvas.LineTo(x2,ydif1);
    PaintBox1.Canvas.MoveTo(x1,ydif1);
    PaintBox1.Canvas.LineTo(x2,ydif1);
  end;

  x1_ := x1;
  y1_ := y1;
  x2_ := x2;
  y2_ := y2;
  ydif1_ := ydif1;
  xdif1_ := xdif1;
end;
Dem Form.Paint-Ereigniss hab ich nun den ButtonClick zugeordnet, bin mir aber nicht sicher ob das der beste Weg ist.

Was mich wundert, die rote Linie wird nicht ganz korrekt gelöscht, daher hab ich (hier jetzt auskommentiert) einfach jedesmal ein grosses Rectangle in FormFarbe gemalt. Das dürfte nichts ausmachen.

So schwer isses ja tatsächlich nicht :D

Nikolas 16. Jul 2004 18:41

Re: Komponente für "Brainstorm"-Diagramme gesucht
 
Das löschen per Rectangle kannst du später nicht mehr nutzen, ohne alle Verbindungen neu zu zeichnen. Benutz zum zeichnen lieber eine Procedure der du die (Anfangs- und) Endpunkte, sowie die zeichenfarbe und die Zeichenfläche übergibts. Das macht den Code übersichtlicher und du kannst einfacher an unterschiedlichen Stellen auf die procedure zugreifen. Tipp für Leserlichkeit:
Delphi-Quellcode:
PaintBox1.Canvas.Pen.Color := clRed;
PaintBox1.Canvas.MoveTo(x1,y1);
PaintBox1.Canvas.LineTo(xdif1,y1);
=
Delphi-Quellcode:
with paintbox1.canvas do
pen.color:=clred;
moveto(x,y);
lineto(x,y);
end;

Eisenherz 19. Jul 2004 10:31

Re: Komponente für "Brainstorm"-Diagramme gesucht
 
Zitat:

Zitat von Toxman
Ja und? Diese ganzen Eigenschaften lassen sich ja auch realisieren. Bis jetzt war nur eine Möglichkeit gesucht, solche Linien zu zeichnen. Was jetzt damit gemacht wird, ist doch eigentlich wieder Tyler's Sache.

Wenn man sich nur auf ein Feature konzentriert, dann ist die Wahrscheinlichkeit hoch, dass das daraus resultierende Design zwar für dieses eine Feature aber nicht für einige der anderen Features geeignet ist. Wenn man dann das nächste Feature dazunehmen will, dann passiert es nicht selten, dass man feststellen muss, dass man den größten Teil seines Codes wegschmeißen und nochmal so gut wie von vorne anfangen darf. Deshalb wäre es gut, wenn man sich zuerst Gedanken macht, was das Programm so alles mit der Zeit wird können müssen und dementsprechend das Design danach ausrichtet.

Andererseits bedarf es dafür einer gewissen Erfahrung. Woher bekommt man die Erfahrung? Indem man selbst etliche male in solche Sackkgassen reingerannt ist. Also vergesst meinen Vorschlag und geht euren eigenen Weg. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr.
Seite 2 von 2     12   

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