Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TMemo: Message wenn sich die Pos. des Caret ändert? (https://www.delphipraxis.net/735-tmemo-message-wenn-sich-die-pos-des-caret-aendert.html)

Sharky 30. Aug 2002 11:48


TMemo: Message wenn sich die Pos. des Caret ändert?
 
Hai ihr.

Gibt es eine Möglichkeit zu erfahren ob sich die Postion des Caret in
einem Memo geändert hat?

Ich möchte folgendes erreichen:

Ich habe ein Memo in welchen aus einer Datenbank Text geladen wird.
Jetzt soll der Anwender zusätzlichen Text schreiben dürfen.
Der vorhandene (die ersten n Zeilen des Memos) darf aber nicht verändert/gelöscht werden.

Mir wäre es am liebsten wenn er das (oder heisst es den?) Caret überhaupt nicht dort hinsetzen kann.

Christian Seehase 30. Aug 2002 12:20

Moin Sharky,

nur mal so als Idee:
Prüfe doch im OnKeyDown ab, wo sich das Caret befindet (Zeile), und lösche das eingegebene Zeichen einfach wieder. Anschliessend das Caret auf den Anfang des zugelassenen Bereiches setzen.
Oder aber mach das ganze zweigeteilt:
Oben ein Memo, dessen Inhalt nicht geändert werden darf, unten eines wo Änderungen zulässig sind.
Letzters fände ich persönlich sauberer.

Sharky 30. Aug 2002 12:29

Zitat:

Zitat von Christian Seehase
Moin Sharky,

nur mal so als Idee:
Prüfe doch im OnKeyDown ab, wo sich das Caret befindet (Zeile), und lösche das eingegebene Zeichen einfach wieder. Anschliessend das Caret auf den Anfang des zugelassenen Bereiches setzen.
Oder aber mach das ganze zweigeteilt:
Oben ein Memo, dessen Inhalt nicht geändert werden darf, unten eines wo Änderungen zulässig sind.
Letzters fände ich persönlich sauberer.

Moin Christian,
an das OnKeyDown hatte ich auch gedacht. Aber dann muss ich es natürlich auch noch im OnMouseDown machen.

Das mit den zwei Memos hatte ich zuerst. Das Problem ist aber das es ohne Problem 8-10 Zeilen Text sein können die aus der Datenbank kommen.
Darum müsste auch das obere scrollbar sein. Sieht aber nicht gut aus finde ich.

Zur Zeit löse ich das ganz im OnChange-Event:

Code:
procedure TFRM_Neu_Vorgang.Memo1Change(Sender: TObject);
var
 sel_start : LongInt;
begin
 sel_start := SendMessage(memo1.Handle, EM_LINEFROMCHAR, memo1.SelStart, 0);
 If (sel_start <= art_bezeichnung_zeilen-1) then
  begin
   Memo1.Perform (EM_UNDO,0,0);
   Memo1.Perform (EM_EMPTYUNDOBUFFER,0,0);
  end;
end;
Wobei art_bezeichnung_zeilen die Anzahl der Zeilen angibt die aus der Datenbank kommen.


P.S.: Wie kann ich eigentlich meinen Quellcode im Forum formatieren?

Christian Seehase 30. Aug 2002 12:37

Moin Sharky,

das OnMouseDown müsstest Du nicht unbedingt abfangen, denn damit wird ja nur die Position geändert, aber noch nichts eingegeben. Wäre also eventuell zu verschmerzen.
Wenn Du die maximal mögliche Anzahl Zeilen kennst, kannst Du das Memo ja entsprechend hoch machen.

Statt Perform würde ich übrigens immer SendMessage verwenden, da es mit Perform nicht immer funktioniert (warum auch immer).

Sharky 30. Aug 2002 12:41

Hai Christian.

Hihihi.. ich habe leider nicht viel Platz auf dem Formular.
Das ganze wird die Erfassungsmaske für Auftragspositionen.
Oben stehen die Positionen und unten werden die Daten für
die neuen Positionen eingegeben.
Ich werde es mal im OnKeyDown testen.
Danke für den Tip bzgl. Perform und SendMessage!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 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