Autor Beitrag
Martello
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: Mo 30.03.09 14:54 
Hallo,

ich habe eine UNIT gebastelt, die Mess-Daten aus einer Textdatei in einem Diagramm darstellt.
Das ganze habe ich als Projekt mit einer UNIT1 gespeichert.

Wie kann ich denn diese Diagrammdarstellung nun in ein anderes Projekt (mit einer Form1) einbinden? Dort werden bereits verschiedene Operationen mit den Daten durchgeführt. Die scrollbare Darstellung soll lediglich als weitere Auswahloption hinzugefügt werden.

Mo.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 30.03.09 15:05 
Menüpunkt >> Neu >> Formular ? oder meinst du das anders?

Denn so verstehe ich das gerade.
Andreas Schilling
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 1

WIN XP, WIN 7
Delphi 5 Ent, Delphi 2007 Pro, XE4
BeitragVerfasst: Mo 30.03.09 15:26 
Im alten Projekt das Formular umbenenen in Form2, dann über Menü "Datei --> Speichern unter" als Unit2.pas speichern und das andere Projekt öffnen. Die umbenannte Form zu den Quelltext des anderen Projekt kopieren und in Delphi über Menü "Projekt --> Projekt hinzufügen" die Unit2 einbinden in das neue Projekt.
Martello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: Mo 30.03.09 15:38 
user profile iconAndreas Schilling hat folgendes geschrieben Zum zitierten Posting springen:
Im alten Projekt das Formular umbenenen in Form2, dann über Menü "Datei --> Speichern unter" als Unit2.pas speichern und das andere Projekt öffnen. Die umbenannte Form zu den Quelltext des anderen Projekt kopieren und in Delphi über Menü "Projekt --> Projekt hinzufügen" die Unit2 einbinden in das neue Projekt.


Aber der Objektinspektor hat was gegen Umbennnen einzuwenden:cry:
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 30.03.09 21:06 
user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Aber der Objektinspektor hat was gegen Umbennnen einzuwenden:cry:
Wie meinst du das?

Die Unit und das Projekt kannst du (Ab Delphi 2005, vorher ist das etwas... :puke:) auch einfach rechts in der Projektverwaltung umbenennen. Klick auf das Projekt oder die Unit und drück F2. Das Formular selbst kannst du unter Name im Objektinspektor umbenennen.

Danach solltest du die andere Unit dem Projekt hinzufügen können.
Martello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: Mo 30.03.09 22:13 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:


Die Unit und das Projekt kannst du (Ab Delphi 2005, vorher ist das etwas... :puke:) auch einfach rechts in der Projektverwaltung umbenennen. Klick auf das Projekt oder die Unit und drück F2. Das Formular selbst kannst du unter Name im Objektinspektor umbenennen.

Danach solltest du die andere Unit dem Projekt hinzufügen können.


Es gibt wohl eine ganze Reihe von Möglichkeiten; irgendwie ist es mir dann auch gelungen. Aber wahrscheinlich habe ich diesmal noch nicht die eleganteste gewählt :?
Martello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: Di 31.03.09 17:08 
user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:

Es gibt wohl eine ganze Reihe von Möglichkeiten; irgendwie ist es mir dann auch gelungen. Aber wahrscheinlich habe ich diesmal noch nicht die eleganteste gewählt :?


In einer Anwendung ruft ein Mausklick auf Form1 die Form2 auf, dort kann ich erneut auf ein Button klicken... Das Mausklick-PingPong funktioniert prima. Daraufhin habe ich den Inhalt der UNIT2 mit anderem sinnvollerem Code gefüllt.

Die Kompilierung funktioniert, aber das PingPong versagt. Die Form2 erscheint überhaupt nicht, der "sinnvolle" Code wird nicht ausgeführt.

Die Anweisung in UNIT1

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
application.createform(TForm2,Form2);
form2.show;
end;


zeigt kein Form2 :cry:

Woran könnte das liegen?

Mo.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 31.03.09 17:14 
Du musst irgendwo etwas machen, was da Probleme macht, aber ohne den Code kann ich da nicht viel zu sagen. :nixweiss:

Der gepostete Code ist korrekt, auch wenn ich es eher über einen normalen Konstruktoraufruf mache.
ausblenden Delphi-Quelltext
1:
2:
Form2 := TForm2.Create(Self);
...
Martello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: Di 31.03.09 20:07 
user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:

Du musst irgendwo etwas machen, was da Probleme macht, aber ohne den Code kann ich da nicht viel zu sagen. :nixweiss:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Form1 hat nur ein Botton...

ausblenden volle Höhe 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:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
application.createform(TForm2,Form2);
form2.show;
end;

end.


Form2 enthält den "sinnvollen Code":


ausblenden volle Höhe 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:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
unit unit2;

interface

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

type
  TForm2 = class(TForm)
    ScrollBar1: TScrollBar;
    Paintbox1: TPaintBox;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2:  TForm2;
  mylist: TStringlist;
  bmp:    TBitmap;
  weite:  integer;
  zeilen: integer;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin

mylist:=TStringlist.create;
mylist.loadfromfile('c:\ort\017.txt');

bmp := TBitmap.create;
bmp.canvas.Brush.color:=clwhite;
bmp.canvas.Pen.width:=1;
bmp.Width:=paintbox1.width;
bmp.Height:=paintbox1.Height;

weite:=round(mylist.count/paintbox1.width);
{edit2.Text:=inttostr(mylist.count);
edit3.Text:=inttostr(weite);}

scrollbar1.Max:=round(mylist.count/weite);
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
bmp.free;
end;


procedure TForm2.PaintBox1Paint(Sender: TObject);
begin
BitBlt(Paintbox1.canvas.Handle,0,0,bmp.Width, bmp.Height, bmp.canvas.Handle,0,0,SrcCopy);
end;

procedure TForm2.Button1Click(Sender: TObject);
var i:integer;
begin

bmp.canvas.moveto(0,paintbox1.height div 2);

for i:=1 to paintbox1.width do
 begin
    bmp.canvas.lineto(i,round(-10*strtofloat(mylist[i]))+paintbox1.height div 2);
 end;
 paintbox1.Repaint;
end;


procedure TForm2.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);

  var i :integer;

  begin

  bmp.canvas.Rectangle(0,0,clientwidth,clientheight);
  {edit1.Text:=inttostr(scrollbar1.position);}
  bmp.canvas.moveto(paintbox1.width,paintbox1.height div 2);
  bmp.canvas.lineto(0,paintbox1.height div 2);

for i:=1 to paintbox1.width do
 begin
    if (i+weite*scrollbar1.position) < (mylist.Count-1) then
    bmp.canvas.lineto(i,round(-10*strtofloat(mylist[i+weite*scrollbar1.position]))+paintbox1.height div 2);
 end;
 paintbox1.Repaint;

end;

end.


Ich wüßte nicht, wo der Fehler liegen könnte :nixweiss:
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 31.03.09 20:18 
Abgesehen von der fehlenden Fehlerbehandlung und dem absoluten Pfad (c:\ort\017.txt) sehe ich da nichts ungewöhnliches. Häng das Projekt doch ganz an (mach den absoluten Pfad weg und ersetze den durch den deiner Exe oder so), dann könnte ich es testen und schauen woran es liegt.
Martello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: Mi 01.04.09 16:44 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Abgesehen von der fehlenden Fehlerbehandlung und dem absoluten Pfad (c:\ort\017.txt) sehe ich da nichts ungewöhnliches. Häng das Projekt doch ganz an (mach den absoluten Pfad weg und ersetze den durch den deiner Exe oder so), dann könnte ich es testen und schauen woran es liegt.


Ich habe ein Verzeichnis c:\zwie angelegt und das Projekt dorthin kopiert, da ich nicht genau verstehe was Du meinst. :?
Einloggen, um Attachments anzusehen!
René R.Fo.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 116

Win7
Delphi5 Delphi2005
BeitragVerfasst: Mi 01.04.09 17:03 
Hallo
Wenn ich das richtig verstehe dan möchtest du ein 2. Form erzeugen
Dann Datei/Neu/Formular

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Visible := False;
Form2.Visible := True;
end;

Starte das Programm und Bestetige die Meldung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 01.04.09 17:53 
Ich hab mir das Programm angesehen. Ich dachte es mir ja fast schon... :autsch:

Wie wäre es, wenn du den Button auch mit deiner Ereignisbehandlungsroutine verknüpfst? So steht unter Ereignisse im Objektinspektor bei OnClick gar nix und genau das macht Delphi dann auch dort: nix.

Klick doppelt auf den Button, in dem Fall reicht das schon...
Martello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: Mi 01.04.09 21:54 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab mir das Programm angesehen. Ich dachte es mir ja fast schon... :autsch:

Wie wäre es, wenn du den Button auch mit deiner Ereignisbehandlungsroutine verknüpfst? So steht unter Ereignisse im Objektinspektor bei OnClick gar nix und genau das macht Delphi dann auch dort: nix.

Klick doppelt auf den Button, in dem Fall reicht das schon...


Ich mag diesen stummen und machtvollen Inspektor nicht wirklich. Warum sagt er denn nichts? Der Compiler ist schließlich auch nicht auf den Mund gefallen? :?

Vielen Dank. :idea:
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 01.04.09 21:59 
user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Ich mag diesen stummen und machtvollen Inspektor nicht wirklich. Warum sagt er denn nichts? Der Compiler ist schließlich auch nicht auf den Mund gefallen? :?
Was soll denn passieren? Delphi kann ja nicht wissen was du machen möchtest. Du kannst das Ereignis auch per Code nach dem Start zuweisen, evtl. willst du auch ein anderes Ereignis nutzen als das Standardereignis einer Komponente, ...

Deshalb gibt es da kaum eine Möglichkeit. ;-)
Martello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: Do 02.04.09 08:39 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst das Ereignis auch per Code nach dem Start zuweisen, evtl. willst du auch ein anderes Ereignis nutzen als das Standardereignis einer Komponente, ...


Bisher hatte der große Automat das "Button1Click" immer im Verborgenen hineingeschrieben. Man kriegt ja an der Oberfläche gar nicht mit, was alles passiert hinter den Kulissen. Und das macht es auch ein wenig schwierig mit diesen "visuellen" Programmiersprachen. Einerseits kommt man sehr schnell zu tollen Ergebnissen, wenn man brav allen Klick-Gebrauchsanleitungen folgt. Aber im Grunde wissen wir Anfänger viel zu wenig davon, was eigentlich im Hintergrund essentiell abläuft. Daher passieren dann eben solche Fehler. Immerhin lernt man dank des Forums auch hierbei schnell dazu :?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 02.04.09 13:33 
Schau dir einmal die .dfm Datei an. Dort schreibt Delphi die Definitionen für die visuellen Komponenten hinein. Auch die Ereignisse.
Erreichen tust du diese Datei auch indem du mit rechts auf das Formular klickst und dann auf "Ansicht als Text", zurück kommst du mit "Ansicht als Formular".

Das sind ab Delphi 5 alles Textdateien, die man theoretisch auch manuell bearbeiten kann. Du kannst also einfach einmal schauen was da so alles automatisch passiert. Solange nicht viele Komponenten auf dem Formular liegen, ist die Formulardefinitionsdatei auch recht übersichtlich.