Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Hallo


Atomic - Sa 07.11.09 01:45
Titel: Hallo
Hallo an alle
Ich bin neu hier und hoffe das ich im richtigen bereich bin.

Ich habe ine Problem bei dem ich absolut nicht weiterkomme.

Es geht um folgendes...
Ich möchte zur Laufzeit eine Fromular mit einem Memofld erzeugen.
Dies habe ich auch hinbekommen. Nun möchte ich aber auf das OnChange-Ereignis des Memofeldes zugreifen können um die Größe des Fromulars und des Memofeldes dynamisch anzupassn.
Das soll heisen, wenn ich in das Memofeld etwas hineinschreibe soll sich die Größe automatisch and den Text anpassen.

ich hoffe mir kann jemand helfen


Boldar - Sa 07.11.09 01:49

Du musst als Methode von deiner Form eine entsprechende Prozedur schreiben (die Parameter findest du unter TMemo onchange in der OH) und dann diese zur Laufzeit zuweisen:

Delphi-Quelltext
1:
Memo.onchande := TForm1.memoonchange;                    

mfg Boldar

Edit: das mit der Größe wird etwas komplizierter, es gab da glaub ich mal sone api funktion, die dir die Länge von einem Text liefert, jaenicke weiss dass bestimmt, der hat mir dass damals glaub ich erzählt.
Dementsprechend musst du dann halt Form.width anpassen und im memo einfach die anchors einstellen.


Atomic - Sa 07.11.09 01:53

hm aber wie macht man das wenn dir Form und das memo zur Laufzeit erstellt werden


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:
procedure TForm1.Button1Click(Sender: TObject);
begin
      Testform:=TForm.Create(form1);
      Testform.Borderstyle:=bstoolWindow;
      Testform.Top:=0;
      Testform.Left:=0;
      Testform.height:=500;
      Testform.show;
      Testform.SetFocus;
      Testform.Font.Size:=5;
      testform.BorderIcons:=[];
      testform.Cursor:=crhandpoint;
      Text:=TMemo.Create(self);
      text.parent:=testform;
      text.ScrollBars:=ssVertical;
      text.Top:=4;
      text.Left:=4;
      text.WordWrap:=true;
      text.BorderStyle:=bsNone;
      text.width:=100;
      text.text:=memo1.text;

end;


Moderiert von user profile iconKlabautermann: Delphi-Tags hinzugefügt.


Boldar - Sa 07.11.09 02:03

du musst halt

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:
procedure TForm1.memokeydown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
//Breite anpassen
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Testform:=TForm.Create(form1);
Testform.Borderstyle:=bstoolWindow;
Testform.Top:=0;
Testform.Left:=0;
Testform.height:=500;
Testform.show;
Testform.SetFocus;
Testform.Font.Size:=5;
testform.BorderIcons:=[];
testform.Cursor:=crhandpoint;
Text:=TMemo.Create(self);
text.parent:=testform;
text.ScrollBars:=ssVertical;
text.Top:=4;
text.Left:=4;
text.WordWrap:=true;
text.BorderStyle:=bsNone;
text.width:=100;
text.text:=memo1.text;
text.onkeydown := self.memokeydown;

end;


Aber warum setzt du wordwrap, wenn du doch grade nicht umbrechen willst, sondern die breite anpassen willst? Und warum nimmst du nicht einfach scrollbars?


Atomic - Sa 07.11.09 02:07

Das mit dem WordWrap ist noch ein rest aus meinen Testversuchen
hab nur schnell mal reinkopiert

Denn das ist mein Testquellcode denn das Programm dazu ist entwickelt aber eben diese funktion fehlt noch

Scrollbars sind ja möglich und das funktioniert auch super, nur gefällt mir das nicht so sonderlich gut.
Es soll sich eben die From mit den Memofeld zusammen vergrößern wenn man den Text im Memofeld ändert.
Ich weis eben nicht wie man die Ereignisse anspricht. Denn zur Entwicklungszeit kann man ja einfach reinklicken und dann seine Code schreiben.
nur zur Laufzeit geht das leider nicht

lg Atomic


Boldar - Sa 07.11.09 02:23

Halt einfach dem Ereignis eine Methode zuweisen

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
du musst halt

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:
procedure TForm1.memokeydown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
//Breite anpassen
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Testform:=TForm.Create(form1);
Testform.Borderstyle:=bstoolWindow;
Testform.Top:=0;
Testform.Left:=0;
Testform.height:=500;
Testform.show;
Testform.SetFocus;
Testform.Font.Size:=5;
testform.BorderIcons:=[];
testform.Cursor:=crhandpoint;
Text:=TMemo.Create(self);
text.parent:=testform;
text.ScrollBars:=ssVertical;
text.Top:=4;
text.Left:=4;
text.WordWrap:=true;
text.BorderStyle:=bsNone;
text.width:=100;
text.text:=memo1.text;
text.onkeydown := self.memokeydown;

end;


Aber warum setzt du wordwrap, wenn du doch grade nicht umbrechen willst, sondern die breite anpassen willst? Und warum nimmst du nicht einfach scrollbars?


jaenicke - Sa 07.11.09 08:55

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Edit: das mit der Größe wird etwas komplizierter, es gab da glaub ich mal sone api funktion, die dir die Länge von einem Text liefert, jaenicke weiss dass bestimmt, der hat mir dass damals glaub ich erzählt.
Die API-Funktion gibt es, nennt sich GetTextExtentPoint32. Allerdings funktioniert die nicht mit einem Memo, soweit ich mich entsinne weil dessen Handle keine Schriftart zugeordnet ist. Ob man das mit SelectObject selbst machen kann, habe ich nicht ausprobiert.

Heißt: Man muss ein anderes Canvas (z.B. das des Formulars) nehmen und kann dann auch gleich Canvas.TextWidth nehmen (das diese Funktion wrappt). ;-)
Die Schriftart muss man natürlich ggf. vorher an die des Memos angleichen.


Klabautermann - Mo 09.11.09 11:08

Hallo und :welcome: in der Entwickler-Ecke,

bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien [http://www.entwickler-ecke.de/richtlinien.html]:

1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]


Einfach oben bei Deinem ersten Beitrag auf user defined image oder user defined image klicken und den Titel ändern. Danke Dir!

Viele Grüße,
Klabautermann