| Autor |
Beitrag |
TheUnknown
      
Beiträge: 334
|
Verfasst: Fr 08.08.03 20:51
Hi...
In einem Memo oder RichEdit kann man zur Laufzeit mit [Einfg] zwischen "Einfügen" under "Überschreiben" hin und her wechseln... Ist bei allen Proggis so: Word, Delphi-Source-Editor, etc...
Wie kann ich DAS abschalten? Ich meine, dass mein RichEdit entweder IMMER im "Überschreiben"- oder IMMER im "Einfügen"-Modus ist, ohne das der Druck auf die Taste [Einfg] beachtet wird...
Gibt es sowas wie RichEdit.InsertMode := AlwaysInsert und/oder RichEdit.InsertMode := AlwaysOverwrite, oder kann man das irgendwie simulieren? Wichtig wäre vor allem auch, dass der "Überschreiben"-Modus (der nicht mehr abgeschaltet werden kann) direkt beim Programmstart...
|
|
recall
      
Beiträge: 449
|
Verfasst: Mo 11.08.03 00:01
So gehts:
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:
| var Form1: TForm1; Overwrite: Boolean=False; L: LongInt;
implementation
{$R *.dfm}
procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key=45) then begin if Overwrite then Overwrite:= False else Overwrite := True; end; end;
procedure TForm1.FormShow(Sender: TObject); begin L := Length(RichEdit1.Text); end;
procedure TForm1.RichEdit1Change(Sender: TObject); begin if not Overwrite then if Length(RichEdit1.Text)-L = 1 then if Length(RichEdit1.Text) > RichEdit1.SelStart then begin RichEdit1.SelLength := 1; RichEdit1.SelText := ''; end; L := Length(RichEdit1.Text); end; |
Viele Grüsse. 
|
|
recall
      
Beiträge: 449
|
Verfasst: Mo 11.08.03 00:02
Achso, dass war jetzt immer überschreiben,
probier doch mal die Routine für immer einfügen selber...
Ansonsten nochmal melden
Viele Grüsse.
|
|
recall
      
Beiträge: 449
|
Verfasst: Mo 11.08.03 00:05
Heute fällt mir aber auch alles zu spät ein:
Du kannst auch abfangen, ob jemand Einfg (Key=45) drückt, und
dann an dein Memo die WM-Message schicken mit "Einfg"-Taste...
Hab mir jetzt aber noch nicht überlegt, wie es geht.
Vielleicht findest du das ja eleganter.
|
|
TheUnknown 
      
Beiträge: 334
|
Verfasst: Mo 11.08.03 08:36
Kannst Du mir bitte erklären, wie man eine solche WM-Message abfängt oder erzeugt?
Dankeschön.
|
|
recall
      
Beiträge: 449
|
Verfasst: Di 12.08.03 14:05
Also abfangen musst du die nicht (geht ja mit OnKeyDown: if Key=45 then...).
Und erzeugen, tja.....
ungefähr so:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure xxx; var h1, h2: THandle; begin h1 := findwindow(0,'Fenster'); h2 := findwindowex(h1,0,'TRichEdit', ??? ); SendMessage(h2, ??, ??, ??); end; |
Aber leider kenn' ich grad nicht die genaue Syntax.
Du kannst ja mal in der Delphi-Hilfe nach den Params gucken !!!
Werd' nochmal übelegen und dann besser antworten.
Aber sag mal, gefällt dir meine erste Lösung nicht
Viele Grüsse.
|
|
TheUnknown 
      
Beiträge: 334
|
Verfasst: Di 12.08.03 14:26
| recall hat folgendes geschrieben: |
Aber sag mal, gefällt dir meine erste Lösung nicht
Viele Grüsse. |
Hallo recall,
nein, nicht direkt unzufrieden, aber es passt nicht ganz in mein Programmkonzept.
Ich versuche, es zu erklären.
Mein Programm soll per TGroupBox in den Proggi-Options folgendes machen können:
1. Einfg drücken funktioniert und schaltet jeweils um
2. Einfg drücken funktioniert nicht und man ist immer im OVERWRITE-Mode
3. Einfg drücken funktioniert nicht und man ist immer im INSERT-Mode
Jetzt überleg Dir bitte folgendes. Der User hat 1 aktiviert. Er befindet sich durch diverses Drücken der Einfg-Taste nun im OVERWRITE-Mode. Jetzt kriegt der User es im Kopp und will auf 3 umschalten und tut das auch. Jetzt ist das RichEdit aber noch im Overwrite-Mode, obwohl es wegen der Option (3) auf INSERT sein müsste. Wie kriegt ich das hin!?  Man muss doch über die API das (diesen Status) irgendwie umschalten können.
Natürlich könnte ich da eine Meldung machen oder sowas, aber ich will das Programm eben auf diese Automatik programmieren...  Und SO schwer kann das nicht sein; Allerdings ZU SCHWER für mich! 
|
|
recall
      
Beiträge: 449
|
Verfasst: Di 12.08.03 16:37
Hmmm...
Das geht aber auch mit meiner ersten Lösung.
Post mal, ob ich dir sowas schreiben soll (wäre heute abend od. morgen fertig)
Mit SendMessage() hab' ich mich blöd probiert, da schreib ich mehr, als bei meiner Lösung und auch länger dran. Also zumindest denke ich, dass es damit nicht einfacher wird.
Viele Grüsse.
P.S.: Noch nie ein Prog mit so einer merkwürdigen Funktion gesehen, sag mal was kann denn das ????????????
|
|
TheUnknown 
      
Beiträge: 334
|
Verfasst: Di 12.08.03 18:24
| recall hat folgendes geschrieben: |
Post mal, ob ich dir sowas schreiben soll (wäre heute abend od. morgen fertig)
P.S.: Noch nie ein Prog mit so einer merkwürdigen Funktion gesehen, sag mal was kann denn das ???????????? |
Hallo recall,
das Programm heisst eTabula und Du kannst es unter www.jp-freeware.de.vu finden. Alternativ auch irgendwo in diesem Forum in der Freeware-Rubrik mit dem Topic ("Textverarbeitung und Editor: eTabula" - oder so ähnlich).
Stimmt schon, eigentlich ein sehr seltenes Feature, aber ich habe in der Tat zwei AnwenderInnen (unter anderem meine Freundin), die gern dieses Feature sähen. Insbesondere meine Freundin kriegt oft 'nen Fön, weil sie manchmal auf die Einfg-Taste kommt und dann so einige Dinge wieder überschreibt.  Deshalb bat sie mich, das irgendwie abschalten zu können. Ich bin schon soweit, dass das RE (RichEdit) beim Druck auf Einfg nicht mehr umschaltet, aber dass das RE halt immer auf Option 2 oder 3 steht, wenn man umschaltet oder das Programm startet, bekomm ich einfach nicht hin... Hierfür müsste ich halt irgendwie den Status manipulieren können - was ganz bestimmt irgendwie geht...
Aber: Wenn Du DAS echt versuchen würdest, wäre Dir mein Dank sicher und ich würde Dich dann auch gern in der "Danke"-Liste des "Über"-Dialogs erwähnen, wenn Du's dann erlaubtest. Also: Wenn Du versuchen wollen würdest, bitte ich Dich hiermit darum... 
|
|
recall
      
Beiträge: 449
|
Verfasst: Di 12.08.03 21:29
hmmm... gibts davon auch einen Quelltext ?
Das sieht ja nicht so aus wie zum Verkauf, aber interessant !
Ich würde dafür gerne ein paar Features schreiben
Nur für ein ganzes Prg bin ich zu faul und überhaupt...
Viele Grüsse.
P.S.: Dann kann ich die Funktion für Einfg gleich einfügen 
|
|
recall
      
Beiträge: 449
|
Verfasst: Di 12.08.03 23:11
OK, hier die fertge Lösung, mit der alles geht !!!
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: 102: 103: 104: 105: 106: 107: 108:
| { Du brauchst:
RichEdit1 -> Ist ja klar wofür ! ComboBox1 -> Brauchst nix einstellen, ist alles in FormShow ! Label1 -> Zeigt den Status an, also Überschreiben oder Einfügen ! }
var Form1: TForm1; Overwrite: Boolean=False; L: LongInt; Status: Byte=0; {0: über Einfg-Taste gesteuert} {1: Immer einfügen} {2: Immer überschreiben} S: String='';
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject); begin ComboBox1.Items.Clear; ComboBox1.Items.Add('Immer überschreiben'); ComboBox1.Items.Add('Immer einfügen'); ComboBox1.Items.Add('Steuerung über "Einfg"-Taste'); ComboBox1.Style := csDropDownList; L := Length(RichEdit1.Text); Label1.Caption := 'Einfügen'; ComboBox1.ItemIndex := 2; end;
procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key=45) then begin if Overwrite then Overwrite:= False else Overwrite := True; end; if Overwrite and (Status=0) then Label1.Caption := 'Überschreiben'; if (not Overwrite) and (Status=0) then Label1.Caption := 'Einfügen';
{Puffer für Status=1} if Length(RichEdit1.Text) > RichEdit1.SelStart then begin if RichEdit1.SelLength=0 then begin RichEdit1.SelLength := 1; S := RichEdit1.SelText; RichEdit1.SelLength := 0; end; end else S := ''; end;
procedure TForm1.RichEdit1Change(Sender: TObject); begin if Status=0 then EXIT; if Status=1 then begin if Overwrite then begin if Length(RichEdit1.Text)-L = 0 then if Length(RichEdit1.Text) >= RichEdit1.SelStart then begin RichEdit1.SelLength := 0; RichEdit1.SelText := S; RichEdit1.SelStart := RichEdit1.SelStart - 1; end; end; end; if Status=2 then begin if not Overwrite then if Length(RichEdit1.Text)-L = 1 then if Length(RichEdit1.Text) >= RichEdit1.SelStart then begin RichEdit1.SelLength := 1; RichEdit1.SelText := ''; end; end; L := Length(RichEdit1.Text); end;
procedure TForm1.ComboBox1Change(Sender: TObject); begin if ComboBox1.Text='Steuerung über "Einfg"-Taste' then begin Status := 0; if Overwrite and (Status=0) then Label1.Caption := 'Überschreiben'; if (not Overwrite) and (Status=0) then Label1.Caption := 'Einfügen'; end; if ComboBox1.Text='Immer einfügen' then begin Label1.Caption := 'Einfügen'; Status := 1; end; if ComboBox1.Text='Immer überschreiben' then begin Label1.Caption := 'Überschreiben'; Status := 2; end; end; |
Viele Grüsse. Wenn noch was ist kannst du fragen, siehe aber auch mein Posting davor 
|
|
recall
      
Beiträge: 449
|
Verfasst: Di 12.08.03 23:13
|
|
recall
      
Beiträge: 449
|
Verfasst: Di 12.08.03 23:39
Ahhh... Mist zu spät gefunden.
Die Funktion zum Simulieren von Tastatureingaben heisst:
Quelltext
x=Code der Taste, steht in der Delphi-Hilfe, meine Hilfe ist nur kaputt, deshalb musste selber nachschauen  .
Viele Grüsse.
P.S.: Aber mein Code funzt ja trotzdem  .
|
|
TheUnknown 
      
Beiträge: 334
|
Verfasst: Mi 13.08.03 08:06
Hallo recall!
zunächst: Völlig Wurscht, ob's klappt oder nicht: DANKE FÜR DEINE MÜHE!!!
Ja, Dein Code funktioniert, nur frage ich mich, ob es nicht recht langsam ist, den Status immer über das Hin- und Herkopieren des Textinhaltes über die Variable 'S' laufen zu lassen, zumal ich ein MDI verwende, wo ich das 'S' immer hin- und hershiften müsste, wenn der User des RichEdit wechselt...
Ich habe es mal mit Deinem Vorschlag versucht, es über KEYBD_EVENT zu machen, aber das klappt wohl nicht. Ich bekomme zwar keine Fehler beim Aufruf der Funktion, aber der Status lässt sich nicht manipulieren... Es ist, also ob ich diese Funktion nicht aufrufen täte...
NOCHMALS: DANKESCHÖN! Aber es würde echt sehr kompliziert werden, Deinen Code in den meinen einzuflechten... Bitte halte mich nicht für undankbar!
|
|
recall
      
Beiträge: 449
|
Verfasst: Mi 13.08.03 08:34
Hi, werde es nachher mal versuchen, kann aber auch morgen werden
Viele Grüsse.
P.S.: Ich frage mich, wo die Spezies bleiben, die sonst immer alles über diese Thema (keybdevent usw.) wissen ??
Hallo Leute ?
|
|
recall
      
Beiträge: 449
|
Verfasst: Do 14.08.03 13:10
*heul* kriegs nicht mehr hin, wenn du es rausfindest, dann sag mal wie !?
Viele Grüsse.
|
|
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.
Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.
|
|