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
Seite 4 von 4   « Erste     234   
Benutzerbild von akurka
akurka

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

AW: Tastatur Eingabe im Canvas Objekt

  Alt 2. Nov 2014, 17:43
Hallo bcvs
Gemäss Deinem Vorschlag habe ich den Programmteil (NCAS00)nctbas01 als methode von TForm2 sowie alle anderen zugehörige proceduren.
Und alle Bildzugriffe im Form2 auf Paintbox ergänzt.
Der wechsel von Form1 zu Form2 habe ich wie folgt gelöst:
Delphi-Quellcode:
case Status.CNC.ZBETR of
                    0..8,
                    10..14: begin
                              Form2.Show;
                              NCAS00.Form2.nctbas01;{ Modul 'NCTBAS00' }
                            end;
Die Istwert-Anzeigen im Menü REF/MAN funktionieren, aber das Edit feld
bleibt ohne fokus, somit ist keine Eingabe möglich.
OnkeyPress habe ich sowohl in Form1 wie auch in Form2.
was mache ich falsch ?

Uebrigens bin ich paralell dazu daran, dass Gleiche auch als Consoleprogramm zu machen, so kann ich es vergleichen.
Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#32

AW: Tastatur Eingabe im Canvas Objekt

  Alt 3. Nov 2014, 08:46
Hallo Anton,

läuft das case Status.CNC.ZBETR of immer noch in der Schleife repeat until not(ord(Status.CNC.ZBETR) in [0..8,10..15]); ?

Wenn ja, wird da auch irgendwo Application.ProcessMessages aufgerufen?
Zitat:
das Edit feld bleibt ohne fokus, somit ist keine Eingabe möglich.
Ist denn das Programm generell noch bedienbar, d.H. kannst du Form2 mit dem X schließen?
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

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

AW: Tastatur Eingabe im Canvas Objekt

  Alt 3. Nov 2014, 09:59
Hallo bcvs
Ja, das war es !! Vielen Dank für den Tipp.
Ich habe die Application.ProcessMessages in der innerste Schleife von
procedure TForm.MAN eingefügt. und jetzt funktioniert die Eingabe.
Die erste Schleife ist in TForm1(CNC.ZBETR), die zweite im TForm2.nctbas01 und die dritte im Tform2.MAN.
Ich verstehe die Wirkung noch nicht ganz.
Muss man die Application.ProcessMessages immer in eine Schleife einfügen ?
Wenn ich aber die repeat Schleife weglasse, lauft es aber nur einmal
durch ?
Oder verstehe ich es falsch?

Nochmals vielen Dank.
Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#34

AW: Tastatur Eingabe im Canvas Objekt

  Alt 3. Nov 2014, 10:55
Zitat:
Ich verstehe die Wirkung noch nicht ganz.
Muss man die Application.ProcessMessages immer in eine Schleife einfügen ?
Ich versuchs mal zu erklären:

Windows ist ein Nachrichtenbasiertes System. Ein Windows-Programm wird von der Message-Loop gesteuert. In Delphi bekommt man die nicht zu Gesicht. Die verbirgt sich hinter dem Aufruf Application.Run in der .dpr- Datei deines Projektes.

Grob gesagt schickt jede Aktion wie z.B. ein Button-Klick eine Message an Windows, die dann in der Message-Loop verarbeitet wird. Die ruft dann die entsprechende Behandlungsroutine auf und sorgt damit dafür dass dein Programm weiterläuft und Windows bedienbar bleibt. Ein Windows-Programm läuft deshalb nicht in einem Stück durch wie ein DOS-Programm, sondern es wird, durch die Messages gesteuert, mal hier und mal da ein Programmteil ausgeführt. Die Reihenfolge richtet sich nach dem Eingang der Messages in der Message-Loop.

Wenn jetzt eine Schleife so gebaut wird, dass keine Messages abgearbeitet werden können, weil die Programmkontrolle nicht an Windows zurückgegeben wird, kann die Messageloop keine Messages abarbeiten und das Programm hängt.

Deshalb muss in einer Schleife, in der irgendwelche Aktionen stattfinden, die die Oberfläche betreffen dafür gesorgt werden, dass die anstehenden Messages abgearbeitet werden können. Das macht das Application.ProcessMessages. Ohne sieht es in deinem konkreten Fall so aus: Du rufst innerhalb der repeat-Schleife Form2.Show auf. Das wird auch noch ausgeführt. Jetzt schickt das Form2 eine Message an Windows mit dem Inhalt "Setze Focus auf Edit1". Diese Message kann aber nicht abgearbeitet werden, weil dein Programmfluss noch in der Repeat-Schleife festhängt.

Allerdings muss man aufpassen: zuviel Application.ProcessMessages kann auch schädlich sein. Das führt aber jetzt zu weit.

Ich hoffe, ich konnte das einigermaßen erklären. Wenn ich noch was vergessen habe, korrigiere man mich.
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

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

AW: Tastatur Eingabe im Canvas Objekt

  Alt 3. Nov 2014, 11:40
hallo bcvs
Also wenn ich Dich richtig verstanden habe, man darf im Programm Schleifen machen.

In meinem Fall ist es so, dass die Tform1 lediglich der Initialisierung der Schnittstelle und starten vom ComPort Thread dient.
Nach dem das CNC.ZBETR empfangen wurde(kommt vom Thread) komme ich in die zweite Schleife in Form2.nctbas01. Hier wird je nach CNC.ZBETR weiter verzweigt in die eigentliche Menüs.
Das ist im vorligende Fall das TForm2.MAN(CNC.ZBETR=6, später kommen andere).
In den ersten zwei Schleifen is also kein Application.ProcessMessages nötig.

Dagegen in der TForm2.MAN musste man es aufrufen.
Diese Schleife wird verlassen, wenn sich CNC.ZBETR ändert, was ja richtig ist.

Und das gleiche Prinzip muss man auch bei anderen Menüs anwenden.
Ich denke jetzt bin ich um einiges optimistischer was das Delphi anbelangt.
Ist es doch besser die Konsollevariante links liegen lassen?

Du verfügst offenbar über recht viel Erfahrung, darf ich Dich auch über
PN ansprechen ?

Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#36

AW: Tastatur Eingabe im Canvas Objekt

  Alt 3. Nov 2014, 12:15
Hallo Anton

Zitat:
Also wenn ich Dich richtig verstanden habe, man darf im Programm Schleifen machen.
Natürlich darf man das.

Zitat:
In den ersten zwei Schleifen is also kein Application.ProcessMessages nötig
Das kann ich so nicht beurteilen. Wenn die Schleife jedenfalls in einem eigenen Thread läuft, braucht man es evtl. nicht, da der Thread seine eigene Message-Loop hat.

Zitat:
Ist es doch besser die Konsollevariante links liegen lassen?
Ich denke ja.

Zitat:
Du verfügst offenbar über recht viel Erfahrung, darf ich Dich auch über
PN ansprechen ?
Naja, geht so, da gibt es hier mit Sicherheit Kollegen mit mehr Erfahrung. Aber PN trotzdem gerne.
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

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

AW: Tastatur Eingabe im Canvas Objekt

  Alt 3. Nov 2014, 17:30
Hallo bcvs
Zitat:
In den ersten zwei Schleifen is also kein Application.ProcessMessages nötig
... Deine Aussage:
Das kann ich so nicht beurteilen. Wenn die Schleife jedenfalls in einem eigenen Thread läuft, braucht man es evtl. nicht, da der Thread seine eigene Message-Loop hat."
Nein die erste zwei Schleifen laufen in keinem Thread.
Ich habe bisher nur den comPort thread, der vom Hauptprogramm Optinum gestartet wurde.
Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   

 

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 21:20 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