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 3 von 4     123 4      
pelzig
(Gast)

n/a Beiträge
 
#21

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 10: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
703 Beiträge
 
Delphi 12 Athens
 
#22

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 10: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
Benutzerbild von akurka
akurka

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

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 11:36
Hallo bcvs
Vielen Dank, dass Du Dich so tief mit meinem Projekt beschaftigst.
Ja Du hast recht, aber ich will das ganze riesen Projekt (6 Mannjahre) nicht über den Haufen rühren. Es ist mir schon klar, dass es ein riesen Gebastel ist. Mein Problem ist wie ich das Ganze mit möglichst wenig Aufwand ins Windows übertrage.
Und ich weiss es, dass ich da ein halbes Verbrechen gegenüber Delphi begehe.
Da habe ich mir auch schon überlegt ob ich besser das Ganze als ein Konsolen Programm schreiben soll mit win.crt und wingraph.pas. Was meinst Du dazu ?

Nun zu Deinen Fragen : Die CNC sendet Meldungen(verschieden Lang) über rs232 ,ein thread empfängt die und schreibt die Daten in Glob.Var. Das funktioniert auch recht gut.
Wenn ZBETR=06 (glob.var)wird aus dem Hauptprogramm (Form1) das nctbas01 gestartet - > Form2 -> MAN (Menü MAN/REF).
Hauptprogramm befindet sich in NCPSA0.PAS.
Es ist natürlich jetzt noch vieles auskomentiert und zum Teil als mehr oder weniger Versuchs Programm. Aber mir graut es, dass ganze vom Grund auf neu aufzustellen.
Ich versuche die relevante Teile des Programms zusammenstellen (es ist in etwa ein Zehntel des gesamten)und sende es im Anhang.
Gruss Anton
Angehängte Dateien
Dateityp: zip OptiNumeric.zip (36,4 KB, 9x aufgerufen)
Anton Kurka
  Mit Zitat antworten Zitat
bcvs

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

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 12:23
OK, da ist auch noch ein Thread involviert. Das macht das Ganze auch nicht gerade einfacher.

Das scheint mir alles ziemlich ineinander verflochten zu sein. Ich denke, du hast zwei Möglichkeiten:

1. Du machst die die Mühe und zerpflückste es und schreibt es windowskonform neu. Dazu gehört dann auch dass man Ausgaben nicht einfach mit Canvas.TextOut auf den Canvas malt, sonder dass alle Canvas-Operationen ausschließlich im OnPaint stattfinden. Ansonsten ist die Ausgabe wieder weg, wenn sich das Fenster neu zeichnen muss, weil z.B. ein anderes Fenster drübergeschoben wurde. Und Grafikausgaben aus einem Thread heraus müssen uber Synchronize erfolgen.

oder:
2. Du machst das mit dem Konsolenprogramm.

Der Mittelweg, den du momentan angefangen hast, funktioniert nicht.

Und wie schon gesagt: lass hier:
Delphi-Quellcode:
procedure TForm1.grafikinit;
begin
  Form1.Image1.Left := 0;
  Form1.Image1.Top := 0;
in den Aufrufen das Form1 weg:
Delphi-Quellcode:
procedure TForm1.grafikinit;
begin
  Image1.Left := 0;
  Image1.Top := 0;
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

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

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 12:43
Hallo bcvs
Und wenn ich das main case/sub case als Konsolen programm mache und erst bei der einzelnen Menüs (es sind im ganzen 13 Menüs + 5 Untermenü) als FormX.Paintbox definiere ?
Anton Kurka
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#26

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 12:54
Hallo bcvs
Und wenn ich das main case/sub case als Konsolen programm mache und erst bei der einzelnen Menüs (es sind im ganzen 13 Menüs + 5 Untermenü) als FormX.Paintbox definiere ?
Ich denke, Du solltest das ganze Programm neu aufsetzen!
Nein ganz so schlimm ist es nicht, aber als ich eben die Screenshots gesehen habe, hatte ich schon ein Dejavu. DOS-Programme funktionieren anders als Windowsprogramme. Was damals mit
Delphi-Quellcode:
repeat
..
until keypressed
gemacht wurde, ist heute mit Application.Run erledigt.
Du solltest dir zuerst einen PAP erstellen, vllt. gibt's den ja auch noch, und dann das als Windowsprogramm neu aufsetzen. (Beinahe)alles was Du damals für die Datenverarbeitung genutzt hast, ist heute auch noch verwertbar, aber auch hier kann ich nur zur Vorsicht raten, denn nicht nur der String hat sich geändert.

Was Deine "Alt-Oberfläche" angeht, die kann man meiner Meinung nach auch mit TLabel und TMemo nachbauen, U.U wäre da auch noch für TFrame ein effizenter Einsatz möglich.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
bcvs

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

AW: Tastatur Eingabe im Canvas Objekt

  Alt 31. Okt 2014, 13:07
Genau,

und auf den Thread kannst meiner Meinung mach auch verzichten, wenn Du den CNC-Datenempfang in eine Methode deines Mainforms auslagerst, z.B. so: (zumindest vorerst, bis alles läuft)
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  ...
  private
    procedure PerformCNCData;
  ...
  end;

procedure TForm1.FormShow(Sender: TObject);
begin
  PerformCNCData;
end;

procedure TForm1.PerformCNCData;
begin
  while true do begin
    byt := READBYTE;
    case (byt and $0F) of
    ...
    end;
    Application.ProcessMessages; // Hier sehr wichtig, damit das Programm noch bedienbar bleibt
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

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

AW: Tastatur Eingabe im Canvas Objekt

  Alt 1. Nov 2014, 10:15
Hallo bcvs
Warum schlägst Du im Mainform doch die TForm?
Was hätte ich für Nachteile wenn ich das ganze als Konsolen programm
umschreibe ?
Mit wingraph kann ich doch auch graphiken machen.
Und die alte Programmstruktur kann ich praktisch unverändert übernehmen.
Jetzt sage ich etwas ketzerisches :
dem Benützer ist es egal ob das Programm im OOP oder Konsole geschrieben ist, hauptsächlich es läuft fehlerfrei.

Ich verstehe, wenn man etwas völlig neues schreibt, dass man es OOP
machen muss.
Aber in meinem Fall komme ich langsam zu der Ueberzeugung dass ich mir nur eine menge Probleme einhandle.

Was sind also die hauptsächliche Probleme in einem Konsolenprogramm
der auch Graphiken benützt ???

Die Frage geht auch an p80286

Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#29

AW: Tastatur Eingabe im Canvas Objekt

  Alt 1. Nov 2014, 13:15
Natürlich kannst Du das machen, man kann auch mit einem LKW Brötchen holen gehen. Will sagen, ein Windowsprogramm tickt anders als ein Konsolenprogramm. Solange Du Dich darauf beschränkst eine Datei einzulesen und diese zu verarbeiten, bist Du mit einem Konsolenprogramm gut bedient. Kommt der Benutzer mit ins Spiel, mag man gerne darüber diskutieren, was besser ist, solange das Schema Benutzeraktion-Programmaktion-Benutzeraktion...... eingehalten wird. Wenn wie in Deinem Fall(?) parallel zur Benutzerinteraktion auch Daten eingelesen werden sollen, dann ist das Windowsprogramm ganz klar im Vorteil, weil es von vorneherein darauf ausgelegt ist. Ein weiterer Vorteil des Windowsprogramms ist die Skalierbarkeit der Oberfläche, die das Konsolenprogramm nicht bieten kann, da bist Du auf 80x25 Zeichen festgelegt (oder wieviele Zeilen kann der Dos-Prompt?).
Ich kann Dir nur nochmal ans Herz legen, zu überlegen was Dein Programm leisten soll, incl. der Benutzerschnittstelle, und dann solltest Du Dich entscheiden wie Du es umsetzen willst.

Ich kann Deine Bedenken nachvollziehen, mir ging's ähnlich, trotzdem kann ich nur sagen, es lohnt sich.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

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

AW: Tastatur Eingabe im Canvas Objekt

  Alt 1. Nov 2014, 17:06
Hallo p80286
Scheinbar sprichts Du aus Erfahrung.
Für mich ist es aber schwierig zu beurteilen welche Lösung besser ist. Da muss ich mich auf Dein Urteil verlassen.

Darf ich kurz skizziren was der alte Programm OptiNumeric(PC Programm unter win98) macht.

1.)
Die CNC sendet Meldungen an PC (rs232) über Istwerte,Sollwerte,Zustand der Eingänge und welche CNC-Satz gerade abgearbeitet wird. Die CNC kann auch völlig unbhängig vom PC laufen, wenn die rs232 abgekoppelt ist, läuft die CNC weiter mit gespeichertem CNC Programm.
2.)
Der Benützer kann neue Programme erstellen, jeder neu eingegebene CNC Satz wird sofort an die CNC weiter gesendet.Das gleiche gilt auch für
andere Eingabe wie Maschinenparameter, Regelkreisparameter usw.
3.)
Die Daten aus den empfangenen Meldungen werden angezeigt. Einerseits
als text oder als Graphik (gefahrene Strecke).
Die einzelne Menüs sind völlig unabhängig. Die Menuewahl wird an der CNC durch Betriebswahlschalter vorgenommen
(MeldungsByte Status.CNC.ZBETR).Es gibt keine Interaktion zwischen den Menüs.
---
Also das PC programm ist im prinzip ganz dumm.

Der Empfang der Meldungen im alten Programm ist durch Polling bewerkstelligt. Das Programm lauft immer in FullScreen, schon darum
weil z.Bsp die Istwerte sollen mit Abstand auch noch lesbar sein.
---
Mein Ziel ist genau die gleiche Funktionalität mit ins WinXP/win7 zu
portieren. Ich habe versucht das alte Programm mittels DOSBox laufen
lassen, das Ganze ist wegen der RS232 sehr unzuverlässig.
Darum habe ich die ganze Kommunikation versuchsweise in einen Thread
verlagert (vorläufig ohne Synchronisation). Und ziemmlich ausgiebig
mit Erfolg bis 230,4 kBaud getestet. Falls die Kommunikation nämlich durch Windows verzögert wird(was ja beim WinXP passiert) koppelt sich der CNC sofort ab (polling unter WinXP geht nicht).

Was meinst Du dazu ?

Ich möchte Dir noch eine PN senden.
Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      

 

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 22:02 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