Autor Beitrag
TheUnknown
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: Mo 11.08.03 00:01 
So gehts:

ausblenden volle Höhe 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:
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. :D
recall
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: Di 12.08.03 23:11 
OK, hier die fertge Lösung, mit der alles geht !!!

ausblenden volle Höhe 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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: Di 12.08.03 23:13 
Zitat:
und ich würde Dich dann auch gern in der "Danke"-Liste des "Über"-Dialogs erwähnen, wenn Du's dann erlaubtest.

Warum sollte ichs nicht erlauben :D :D :D
recall
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: Di 12.08.03 23:39 
Ahhh... Mist zu spät gefunden.
Die Funktion zum Simulieren von Tastatureingaben heisst:
ausblenden Quelltext
1:
  Keybd_Event(x);					

x=Code der Taste, steht in der Delphi-Hilfe, meine Hilfe ist nur kaputt, deshalb musste selber nachschauen :D .

Viele Grüsse.

P.S.: Aber mein Code funzt ja trotzdem :oops: .
TheUnknown Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: Mi 13.08.03 08:34 
Hi, werde es nachher mal versuchen, kann aber auch morgen werden :D

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: 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.