Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Do 14.04.16 11:12 
Liebe Entwickler,
Versuche derzeit meinem Programm etwas mehr Flexibilität zu geben, in dem ich voreingestellte Parameter über eine Form2 bedienbar mache. Stoße dabei auf einige Probleme, z.B. mit dem Aufruf PasteFromClicbord. Im Hauptprogramm gibt es bisher eine Kommandozeile (EditCom) und mehrere Richedit-Objekte. In allen Musterbeispielen ist das Pastekommando an ein exakt definiertes Objekt gebunden. Ich frage daher bisher ab, welches Objekt den Fokus hat und füge dann ein. Die Procedure ist bei mir wie folgt formuliert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.EditPaste(Sender: TObject);
{Einfügen = Strg V, nur unformatierten Text übernehmen}
begin
 if Richedit[FiNrAktiv].Focused=true
    then SendMessage(Richedit[FiNrAktiv].Handle, EM_PasteSpecial, CF_Text, 0)  // uses RichEdit
 else
 if (Edit1Com.Focused=true)
    then Edit1Com.PasteFromClipboard;
end;

Im Zusammenhang mit der geplanten Erweiterung habe ich nun in Form2 eine große Anzahl von TStringrid- und weiteren TEdit-Objekten.
Meine Frage: Gibt es eine Formulierung, dass ich anstelle einer langen Abfrage welches Objekt den Focus hat, alle editierbaren Objekte pauschal ansprechen kann? Nach dem Motto:
ausblenden Delphi-Quelltext
1:
"AktivesObjekt".PasteFromClipboard;					

(Denn die gleich lange Abfragekette hätte ich sonst auch bei CopyToClipboard und CutToClipboard
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 14.04.16 11:21 
Du könntest Du sowas machen:

ausblenden Delphi-Quelltext
1:
2:
If Self.ActiveControl is TCustomEdit then
  TCustomEdit(Self.ActiveControl).PasteFromClipboard;

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Do 14.04.16 19:39 
Also zunächst die gute Nachricht: Die Anweisungen funktionieren bei fast allen Textobjekten (Richedit, TEdit). In Form2 musste ich zwar noch einmal eine Menü-Objekt einfügen und Strg+C, Strg+V zuweisen, ist aber ok
Wo (noch) nicht funktioniert - sowohl beim Kopieren wie auch bein Einfügen -, ist Text mit dem Objekt StringGrid.
Die einzelnen Zellen sind zwar auch dort Text, aber hier funktioniert der Aufruf nicht. Gibt es auch hier eine Möglichkeit zu erkennen, dass es sich um StringGrid handelt. Das wäre super. Ich sage dennoch schon jetzt einmal Dank.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 14.04.16 19:45 
Funktioniert genauso:
ausblenden Delphi-Quelltext
1:
If self.ActiveControl is TStringGrind.....					

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Sa 16.04.16 00:13 
Hallo Jens,
es ist mir fast peinlich, wenn ich nochmals nachfrage. Bin aber kein Profi. Den kleinen Schreibfehler bei StringGrind habe ich natürlich entdeckt. Dennoch: keine der nachstehenden Folge-Anweisungen lässt sich kompilieren. Es kommt: undefinierter Bezeichner PasteFromClipboard oder
ausblenden Delphi-Quelltext
1:
2:
 If self.ActiveControl is TStringGrid then
   TStringGrid(Self.ActiveControl).PasteFromClipboard;

Ebenso auch, wenn ich meine, dass der Wert in eine Celle eingefügt werden soll, also
ausblenden Delphi-Quelltext
1:
 .. then TStringGrid(Self.ActiveControl).Cells[col,row].PasteFromClipboard;					

bzw [Fehler] : Record, Objekt oder Klassentyp erforderlich
ausblenden Delphi-Quelltext
1:
 .. then TStringGrid(Self.ActiveControl).Cells[col,row]:=PasteFromClipboard;					

Auch der Versuch TStringGrid gegen TCustomGrid zu ersetzen, führt zu keinem Erfolg.
Wie muss denn die gültige Anweisung lauten?
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Mo 25.04.16 13:41 
Wie der Text in das Grid eingefügt (bzw. daraus kopiert) wird, musst du selbst bestimmen.
Der einfachste Fall ist nur die aktive Zelle zu kopieren oder deren Inhalt zu überschreiben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
uses
  Vcl.Clipbrd;

procedure PasteFromClipboard(AItem: TStringGrid)
begin
  if Clipboard.HasFormat(CF_TEXT) then
    AItem.Cells[AItem.Col, AItem.Row] := Clipboard.AsText;
end;

procedure CopyToClipboard(AItem: TStringGrid)
begin
  Clipboard.AsText := AItem.Cells[AItem.Col, AItem.Row];
end;


if ActiveControl is TStringGrid then
  PasteFromClipboard(TStringGrid(ActiveControl));
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 25.04.16 15:22 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if Richedit[FiNrAktiv].Focused=true
    then SendMessage(Richedit[FiNrAktiv].Handle, EM_PasteSpecial, CF_Text, 0)  // uses RichEdit
 else
 if (Edit1Com.Focused=true)


"=true" ist überflüssig und unelegant und kann sogar zu Fehlern führen.
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Sa 17.09.16 18:02 
Wenn sich andere engagieren um meine Probleme lösen zu helfen, dann sollte der Button "Frage beantwortet" nicht allzu lange offen bleiben.
Sorry, Blup! Nachdem Dein Vorschlag nicht auf Anhieb lief, überdeckten es andere Probleme.
Ich schreibe zuerst, was nicht funktionierte bzw. ich nicht verstanden habe und danach eine funktiosfähige Hilfslösung.
Vielleicht antwortet noch jemand auf meine unten stehende Frage - nach so langer Zeit.

Probleme:
1. Unter Uses "Vcl.Clipbrd" eingefügt, da streickte der Compiler (nicht gefunden). Uses Clipbrd ist vorhanden.
2. Weiter soll neu definiert werden die
ausblenden Delphi-Quelltext
1:
"Procedure PasteFromClipboard(AItem: TStringGrid);"					

Hier streickt der Compiler bei
ausblenden Delphi-Quelltext
1:
  if Clipboard.HasFormat(CF_TEXT)					

mit der Meldung "Hasformat" nicht definiert. Da Delphi fix fertig die Funktion "PasteFromClipboard" (ohne Parameter), sowie die anderen Funktionen Copy und Cut bereit stellt, war ich mit meinem Latein am Ende.

Da die Funktionen Strg+C, Strg+X, Strg+V ja ganz allgemein funktionieren müssen sieht meine Hilfslösung so aus:
1. bei allen Edit- und Richedit-Objekten volle Funktion
2. bei StringGrid-Objekten wird immer der gesamte Cell-Inhalt gelöscht, kopiert, erneuert

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:
{procedure PasteFromClipboard(AItem: TStringGrid);
begin
  if Clipboard.HasFormat(CF_TEXT) then
    AItem.Cells[AItem.Col, AItem.Row] := Clipboard.AsText;
end; }


procedure TForm2.Cut2Click(Sender: TObject);
{Short-Cut = Strg + X }
var s, sSel:string;
    iStart, iLg : longint;
begin
If Self.ActiveControl is TCustomEdit then
  TCustomEdit(Self.ActiveControl).CutToClipboard
 else
  If Self.ActiveControl is TCustomGrid then
   begin
    with TStringGrid(Self.ActiveControl) do
    begin
// Folgezeile lässt sich leider nicht compilieren, da SelStart, Sellength, SelText nicht auf
// TStringGrid(Self.ActiveControl) anwedbar. C-Meldung: "Variable SelStart unbekannt"   
//   iStart:=SelStart; iLg:=Sellength; sSel:=SelText(Cells[col,row]);
     s:=Cells[col,row]; Cells[col,row]:='';  end;
     with PasteEdit1 do begin    //nicht sichtbares TEdit-Objekt
       Text:=s; SelectAll;
     PasteEdit1.CopyToClipboard; end;
   end;
end;

procedure TForm2.Copy2Click(Sender: TObject);
var s:string;
begin
 If Self.ActiveControl is TCustomEdit then
  TCustomEdit(Self.ActiveControl).CopyToClipboard
 else
  If Self.ActiveControl is TCustomGrid then
   begin
    with TStringGrid(Self.ActiveControl) do s:=Cells[col,row];
     with PasteEdit1 do begin    //nicht sichtbares TEdit-Objekt
       Text:=s; SelectAll;
     PasteEdit1.CopyToClipboard; end;
   end
end;

procedure TForm2.Einfg2Click(Sender: TObject);
var s:string;
begin
 If Self.ActiveControl is TCustomEdit then
  TCustomEdit(Self.ActiveControl).PasteFromClipboard
 else
 If Self.ActiveControl is TCustomGrid then
   begin
    PasteEdit1.Text:='';     //nicht sichtbares TEdit-Objekt
    PasteEdit1.PasteFromClipboard;
    s:=PasteEdit1.Text;
    with TStringGrid(Self.ActiveControl) do Cells[col,row]:=s;
   end
end;

Der Wunsch war, über SelStart, Sellength, SelText den markierten Text zu ermitteln und wie vorgeschlagen, aus-ineinander zu "pfriemeln".
Hat jemand noch einen Vorschlag, wie ich den markierten Text, bzw beim Einfügen den Cursor abfragen kann?
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 18.09.16 12:14 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mo 19.09.16 10:38 
Danke, ja ich arbeite noch mit Delphi7. Habe inzwischen zwar auch XE3, mein Programm ist aber ein spezieller Editor und ich müsste hunderte von Anweisungen von Ansi-String auf UTF8 (mögliche Dopelbyte-Zeichen) umstellen. Dazu fehlte bisher die Zeit bzw. meine Anwendung macht bisher auch keine Doppelbyte-Zeichen-Verarbeitung erforderlich. Doch unabhängig ob Clipbrd mit oder ohne VCL.:
Hast Du meine Frage am Textende übersehen? Lösung für SelStart.. in Verbindung mit StringGrid?
Zunächst habe ich aus der Antwort von Blup entnommen, dass das Kopieren und Einfügen mit Copy-Paste-Cut standardmäßig nicht funktioniert und die einfachste Lösung komplettes Kopieren oder Überschreiben des Cell-Inhaltes wäre. Diese Variante habe ich ja realisiert und sie funktioniert nachweislich. Sein weiter Hinweis, mann müsste ggf mehr Aufwand zur Realisierung der exakten Funktionen betreiben - wollte ich auf mich nehmen. Dazu müsste ich aber mit den Funktionen SelStart, SelLength den markierten Text auslesen bzw. wissen wo der Cursor im Text steht. Die genannten Anweisungen habe ich schon im Programm für Edit/Richedit. Funktioniert aber nicht bei StringGrid.Cells[col,row] bzw. ich fand bisher keinen Befehlscode, den der Compiler akzektiert hätte. Geht nicht oder wie müsste formuliert werden?
Zuletzt: Mit dem Code von Blup komme ich nicht klar. Er definiert PasteFromClipbord (und die anderen) völlig neu, in dem er als Parameter das Grid-Objekt anfügt. Was ist dann aber mit dieser (Standard)-Funktion bei Richedit?
Gruß und Danke fürs Mitdenken
hRb
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 19.09.16 21:37 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Di 20.09.16 22:18 
Zunächst ganz herzlichen Dank so so viel Geduld und für die Antworten. Frühlingsrolle hat wohl bemerkt, dass da ein "Williger" aber Unerfahrener krampfhaft nach Hilfs-Lösungen sucht. Besonderen Dank daher für das Beispiel, das ich in letzter Sekunde - kurz vor der Verzweiflung - noch entdeckt habe. Damit werde ich das Problem wohl lösen können.
Als Oldie, die im Beruf mit geringen Turbo-Pascal-Erfahrungen ausgestiegen ist, hat mit Units und Vererbungslehre halt seine Schwierigkeiten. Insoweit helfen mir gute Tips manchmal weiter, aber funktionsfähiger Code ist eben das Beste. Von daher bin ich selbst bemüht, nachdem eine Frage gelöst ist, ein lauffähiges Code-Beispiel zu bringen.
zwei kleine Anmerkungen:
1. dass die Coppy, Paste und Cut-Funktion auf einem Button liegt und ein Klick auf den Button daher ins Leere geht, war mir bewusst. Die Funktionen wurden auch nur über ShortCut der Buttons bedient; der Menü-Button war visible=false.
2. was ich mit SelStart, SelLength, SelText wollte? Bei Edit-Objekten liefern diese Funktionaufrufe die Position im String, Länge und den markierten Text. Hatte die Hoffnung, dass wenigsten diese Aufrufe auf den Text der StringGrid-Zelle anwendbar sind. Fehlanzeige!
Nochmals Dank für so viel Hilfe. Ich suche einen Gesprächspartner im Raum Karlsruhe. Mein Editor enthält nach vielen Jahren manch Pfiffiges.
hRb
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 21.09.16 01:33 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mo 26.09.16 14:59 
Hallo Frühlingsrolle (und andere Experten)
Vorweg danke ich für alle bisherige Unterstützung.
Nach großer Freude über das beigefügte Beispiel von Frühlingsrolle, ist der anfängliche "Frühling" einem "Herbst" gewichen. Nach viel Lesen was PopUpMenu, PopupComponent und InplaceEditor sind und wie alles zusammenwirkt, brauche ich doch noch Expertenrat. Denn was anfangs so easy aussah, läuft bei mir nur bedingt.

Zunächst die gute Nachricht (für andere): das Beispiel selbst funktioniert super! Eingebaut in mein Programm habe ich jedoch nur Teilerfolge.
Hintergrund: In meinem Hauptprogramm (Form1) gibt es ein MainMenu in dem unter Bearbeiten die Funktionen Strg+C, Strg+V usw. alle schon enthalten sind. Über das MainMenü: Optionen, Einstellungen wird eine Form2 aufgerufen mit:
ausblenden Delphi-Quelltext
1:
Form2.Show;					

In Form2 lassen sich über mehrere Reiter verschiedene Programmparameter des Hauptprogramms einstellen/ändern. In Form2 sind auch das StringGrid- sowie EditObjekte angesiedelt.
Problem:
Das mitgelieferte Beispiel von Frühlingsrolle auf Form2 umzustellen war einfach. Wird mit Maus-Rechtsklick das PopUp-Menü aufrufen, funktionieren alle Funktionen in meinem Programm bestens.
So weit so gut. Doch wo klemmt es?
1. Bediene ich jedoch über ShortCut (Strg+C, Strg+V, etc.), so landen die Aufrufe bei mir nicht bei den Proceduren der Form2, vielmehr werden die Copy- und Paste-Proceduren der Form1 ausgeführt und bewirken Veränderungen im dortigen Richedit der Form1 (obwohl der Cursor z.B. in Form2.Edit steht).
Man beachte: Die ShortCuts des PopUpMenüs von Frühlingsrolle sind nicht besetzt (Parameter: keine).

2. Ändere ich dies, setze also auch beim PopUpMenü in Form2, die ShortCuts Strg+C, Strg+V, usw., dann werden jetzt zwar die Prozeduren von Form2 wieder angesprochen, jedoch funktioniert nun der Aufruf
ausblenden Delphi-Quelltext
1:
FComponent := PopupMenu1.PopupComponent;					

nicht, selbst wenn er in die Copy-Prozedur direkt mit eingebaut wird (auch logisch: der Maus-Rechtsklick fehlt).

3. Versuche ich vorstehenden Aufruf irgendwie zu umgehen, z.B. mit Self.ActiveControl, dann streikt der Compiler bei nachstehendem Aufruf: (InplaceEditor)
ausblenden Delphi-Quelltext
1:
2:
  if FComponent is TStringGrid then  //liefert false
    TStringGrid(FComponent).InplaceEditor.ClearSelection;

4. Ohne Erfolg habe ich auch probiert den gesamten "Frühlingsrolle"-Code in Form1 einzubauen.

Hinweis: Der Aufruf Self.ActiceControl verweist eigenartigerweise immer auf das Form1.Richedit, obwohl der Cursor in Form2 Edit oder StringGrid steht. Müsste ich vor dem Aufruf von Form 2 dieses Objekt deaktivieren, z.B. so:
ausblenden Delphi-Quelltext
1:
2:
Form1.Richedit deaktivieren (wie??)
Form2.Show;

und dann beim Schließen unter: Form2.Close
Form1.Richedit.SetFocus;   // wieder aktivieren?

Ich hoffe, mein zugegebenermaßen komplexes Problem verständlich beschrieben zu haben. Hat da noch jemand einen Tipp, wie ich auch in Form2 mit ShortCut arbeiten kann? Die kleine Lösung (Maus-Rechts) funktioniert ja. Ich drehe mich etwas im Kreis.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 27.09.16 04:00 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: So 09.10.16 14:28 
Hallo Frühlingsrolle,
melde mich nochmal. So ganz einfach scheint das Problem doch nicht zu sein. Ich stelle fest:
1. Kopiert man in Deinem Beispiel2 aus StringGrid1 einen Text und will diesen in ein anderes StringGrid-Feld einfügen funktioniert dies nicht. (sehr wohl aber das Einfügen in ein Edit- oder Richedit-Objekt).
2. Versucht man den unter StringGrid1 kopierten Text in Form2 in ein StringGrid-Feld einzufügen, kommt es gar zu einer Exception.

Oh, inzwischen bemerke ich: während bei Klick auf ein Edit-Feld man sich direkt im Schreibmodus befindet, bewirkt ein KLick auf ein StringGrid-Feld nur die Feldauswahl. Daher kommt die Exception. Aber selbst wenn ich einen zweiten Klick tätige, funktioniert Grid zu Grid nicht (immer). Warum ist unklar, denn es sieht alles sehr logisch aus. Vielleicht liegt es tatsächlich an Delphi7. Sollte ich einmal mein Programm komplett mit XE3 kompilieren können, werde ich es nochmals testen.
Jedenfalls danke ich für alle Unterstützung und schließe vorerst ab.
hRb
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 09.10.16 16:46 
- Nachträglich durch die Entwickler-Ecke gelöscht -