AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tastatur Eingabe im Canvas Objekt

Ein Thema von akurka · begonnen am 29. Okt 2014 · letzter Beitrag vom 3. Nov 2014
Antwort Antwort
pelzig
(Gast)

n/a Beiträge
 
#1

AW: Tastatur Eingabe im Canvas Objekt

  Alt 30. Okt 2014, 22:46
Kann zwar nicht so ganz folgen, aber:

Warum nicht ein unsichtbares TEdit aufs Formular klatschen und je nach dem, was der Anwender drückt, sichtbar machen und dann den Focus auf das TEdit setzen?

Eingaben werden dann vom TEdit entgegengenommen und sollten mit der Esc-Taste verworfen werden (wodurch TEdit wieder versteckt wird).

Allerdings müssten dann Eingaben, die ins TEdit getippt werden, noch mit Return bestätigt werden.

MfG


P.S.: Geile Screenshots mit verwaschenen Schriftgrö0en < 4. Weiter so!
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#2

AW: Tastatur Eingabe im Canvas Objekt

  Alt 30. Okt 2014, 23:23
We know that focus is the ability to receive user input through the mouse or keyboard. Only the object that has the focus can receive a keyboard event. Some controls, such as TImage, TPaintBox, TPanel and TLabel cannot receive focus. The primary purpose of most graphic controls is to display text or graphics.

aus "Delphi about Technology" page
Anton Kurka
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
729 Beiträge
 
Delphi 12 Athens
 
#3

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 07:17
Zitat:
darum muss ich eine Möglichkeit finden für eine direkte Eingabe auf dem Canvas.
In einen Canvas kann man nichts eingeben, darauf kann man nur zeichnen. Alternativ zu pelzigs Vorschlag könntest du auch ein TEdit benutzen, dass ständig den Focus hat. Im OnKeyDown des TEdits reagierst du dann auf Sondertasten wie F1 bis F10 oder deine anderen Steuertasten. Wenn die ankommenden Zeichen als Koordinateneingabe interpretiert werden (wie das unterschieden wird, weißt du selbst am besten), werden sie ganz normal ins TEdit eingetippt.

Ich weiß auch immer noch nicht, wie es aussehen soll, wenn längere Werte eingetippt werden. Willst du die einzelnen Zeichen dann gleich auf den Canvas malen?

Wenn das Edit nicht sichtbar ein soll, kann du es auch außerhalb des Forms plazieren , z.B. mit top=-100.

Zitat:
Only the object that has the focus can receive a keyboard event. Some controls, such as TImage, TPaintBox, TPanel and TLabel cannot receive focus.
Deshalb brauchst du ja
1. eine Komponente, in die du zeichnen kannst. Dazu nimmt man normalerweise eine Paintbox.
2. eine Komponente, die den Focus erhalten kann, z.B. ein TEdit.
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#4

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 08:17
Halo bcvs
Nun das habe ich schon zweimal probiert und jetzt auch noch drittemal.Die Eingabe ins Edit
hat nach dem (Canvas)Bildaufbau kein Focus mehr, obwohl ich Form2.Edit1.SetFocus auch nach dem
BildAufbau aufgerufen habe. Probiere das mal selber, es geht nicht !

Zitat:
We know that focus is the ability to receive user input through the mouse or keyboard. Only the object that has the focus can receive a keyboard event. Some controls, such as TImage, TPaintBox, TPanel and TLabel cannot receive focus. The primary purpose of most graphic controls is to display text or graphics.
If we want to intercept keyboard input for controls that cannot receive the input focus we'll have to deal with Windows API, hooks, callbacks and messages.

Windows Hooks
Technically, a "hook" function is a callback function that can be inserted in the Windows message system so an application can access the message stream before other processing of the message takes place. Among many types of windows hooks, a keyboard hook is called whenever the application calls the GetMessage() or PeekMessage() function and there is a WM_KEYUP or WM_KEYDOWN keyboard message to process.

To create a keyboard hook that intercepts all keyboard input directed to a given thread, we need to call SetWindowsHookEx API function
Ich habe es mit den Tastatur Hook auch bereits probiert, aber vermutlich nur mit local Hook,
was aber nicht funktionierte, man müsste offenbar Global Hook verwenden.
Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
729 Beiträge
 
Delphi 12 Athens
 
#5

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 08:36
Das muss aber gehen. Ich vermute, das Problem liegt ganz woanders.

Der Focus hat doch nichts mit dem Canvas tun.
Zeig doch mal ein bischen Code. Wo machst du denn den Bildaufbau? Der gehört ins OnPaint der Paintbox (oder des Forms, wenn du direkt auf das Form malst).

Zitat:
Form2.Edit1.SetFocus
Lass das Form2 weg und schreib einfach Edit1.SetFocus . Innerhalb einer Form-Klasse auf die eigene Form-Variable zuzugreifen ist ein schlechter Stil, da nicht sichergestellt ist, dass Form2 immer existiert oder immer so heißt.
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#6

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 09:01
Edit1.SetFocus schluckt der compiler nicht.
In der Beilage die zwei relevante units.
Angehängte Dateien
Dateityp: zip Form2Bildaufbau.zip (4,2 KB, 5x aufgerufen)
Anton Kurka
  Mit Zitat antworten Zitat
pelzig
(Gast)

n/a Beiträge
 
#7

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 09:02
Zitat: „In dem Fall das, was ich unter Menü verstehe ist die
Form.“

Ein Formular/Form ist kein Menü.

Die Objekte auf dem Formular/Form könnten aber Aktionen auslösen, wenn man sie anklickt.

Wenn man die unterschiedlichen Objekte auf dem Formular/Form aber als "Menü" bezeichnet, könnte man "Himmel" auch als "Joghurtbecherboden" missverstehen

Was meinst Du eigentlich mit "canvas"?

Sorry, kann leider immer noch nicht folgen, worum es eigentlich geht.

"Schweizer Pensionär" gilt nicht als Ausrede für falsche Begriffsbezeichnungen

MfG
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
729 Beiträge
 
Delphi 12 Athens
 
#8

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 09:41
Ich denke, du solltest dich erst mal ein bischen mit der Windows-Programmierung und der objektoriententierten Programmierung unter Delphi vertraut machen. Das war wahrscheinlich mal ein DOS-Programm. Das kann man aber nicht einfach 1:1 nach Windows umsetzen.

Unter Windows wird der Programmablauf von Messages gesteuert, auf die man in Delphi in den entsprechenden Ereignissen reagieren kann.

Was mir noch nicht klar ist:

Deine procedure nctbas01; ist eine einfache Procedure, keine Klassenmethode. Von wo wird die überhaupt aufgerufen? Das war in dem Dos-Programm wahrscheinlich die zentrale Ablaufsteuerung. Unter Windows brauchst du das nicht mehr, da Windows die Ablaufsteuerung in Form der Message-Loop schon mitbrint. Bu brauchst nur auf die verschiedenen Ereignisse zu reagieren.

Wo kommt das Status.CNC.ZBETR her?

StatusBild; ist ebenfalls ein einfache Procedure. Das muss eine Klassenmethode sein, die dann im OnPaint aufgerufen werden muss.

Hier mal ein Grundgerüst, wie es laufen könnte:
Mach ein neues Projekt auf und lege ein TEdit und ein TPaintbox auf die Form:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    PaintBox1: TPaintBox;
    procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure PaintBox1Paint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure StatusBild;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.SetFocus;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
  vk_F1 : begin
            // mach wa mit F1
          end;
  vk_F2 : begin
            // mach wa mit F2
          end;
  // hier noch auf weitere Tasten reagieren
  end;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  StatusBild;
end;

procedure TForm1.StatusBild;
{zeichnet das Bildgeruest fuer den 'Man'-Mode und beschriftet es}
begin
  PaintBox1.Canvas.Brush.Color:= clRed;
  PaintBox1.Canvas.RECTANGLE(2,2, BildB, BildH);
  with PaintBox1.Canvas do begin
    Pen.Color:=clBlack;
    Brush.Color:= clYellow;

    // Application.ProcessMessages; // Nein: hier bitte bloß nicht aufrufen !!!!

    // das hier sich wahrscheinlich Routinen, die irgendwo in einer Art Bibliothekt definiert sind
    // Da müssten man noch den Canvas all zusätzlichen Parameter übergeben
    Column(K_X3,255,0);
    Row(K_Y1,0,511);
    Row(K_Y6,0,K_X3);
    Row(K_Y7,0,K_X3);
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz