Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - GOTOXY für Memo-Elemente


OeBe - Fr 04.02.22 15:47
Titel: GOTOXY für Memo-Elemente
Hallo,
das Betriebssystem eines Einplatinencomputers der 68322-Reihe liefert über die serielle Schnittstelle an den Host zwei Zahlen für die x- und die y-Komponente des Bildschirms, bei einem Konsolen-Prgramm mit der Abfrage ReadCommWait so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure myGotoXY;
// 0/0 ist der Ursprung des Textbildschirms
begin
  SpNr := ReadComWait;
  ZeNr := ReadComWait;
  GotoXY(SpNr,ZeNr);  // (x, y)
end;

Da ich das Programm auf die graphische Anwendung umstellen möchte, benötige ich ein Äquivalent für GOTOxy in einem Memoelement.
Danke in Voraus für einen Vorschlag.

PS: Delphi 5 läuft in Windows 10 problemlos, wenn der erste Start als Administrator erfolgt.

OeBe

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Moderiert von user profile iconTh69: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 04.02.2022 um 17:00


Th69 - Fr 04.02.22 18:17

Es gibt bei einem TMemo [https://docwiki.embarcadero.com/Libraries/Sydney/de/Vcl.StdCtrls.TMemo]-Element kein wirkliches Äquivalent zum GOTOxy.
Ein Memofeld (Multiline-Editbox) besteht intern nicht aus einem festen XY-Raster (wie ein Konsolenfenster), sondern aus Zeilen mit beliebig viel Text (je Zeile).

Was führst du denn nach dem GOTOxy aus? Schreibst du Text an diese Stelle? Oder möchtest du nur den Cursor dorthin platzieren (damit der Benutzer an dieser Stelle weiterschreiben kann)?

Du könntest zwar ein Konsolenfenster mit einem Memofeld simulieren (Font mit fester Zeichenbreite und dann Y Zeilen mit je X Leerzeichen erzeugen), aber elegant ist das nicht.


mandras - Sa 05.02.22 00:09

Wenn das Memo einen FixedFont aufweist, wird wohl das hier wie kann ich "gehe zu zeile"-funktion realisieren [https://entwickler-ecke.de/topic_wie+kann+ich+quotgehe+zu+zeilequotfunktion+realisieren_31840,0.html] weiterhelfen, siehe der Beitrag von Sprint.
Die richtige Spalte dann zu wählen dürfte nachrüstbar sein, ich habe es selbst nicht probiert.

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.


jaenicke - Sa 05.02.22 20:26

Du könntest das Memo von SynEdit nehmen. Da gibt es auch direkt die Koordinatenfunktion.


OeBe - Do 10.02.22 10:01

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Es gibt bei einem TMemo [https://docwiki.embarcadero.com/Libraries/Sydney/de/Vcl.StdCtrls.TMemo]-Element kein wirkliches Äquivalent zum GOTOxy.
Ein Memofeld (Multiline-Editbox) besteht intern nicht aus einem festen XY-Raster (wie ein Konsolenfenster), sondern aus Zeilen mit beliebig viel Text (je Zeile).

Was führst du denn nach dem GOTOxy aus? Schreibst du Text an diese Stelle? Oder möchtest du nur den Cursor dorthin platzieren (damit der Benutzer an dieser Stelle weiterschreiben kann)?

Du könntest zwar ein Konsolenfenster mit einem Memofeld simulieren (Font mit fester Zeichenbreite und dann Y Zeilen mit je X Leerzeichen erzeugen), aber elegant ist das nicht.


Lösung:
Mit dieser "uneleganten" Art habe ich folgende Methode verwendet, die tadellos funktioniert (Programmauszug):

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:
const
  maxLinien = 30;
  maxSpalten = 50;

var
  Form1: TForm1;
  SpNr, ZeNr: Byte;
  Ch: Char;
  Zeile: array[1..maxSpalten] of Char;
  ZStr: String// muss wegen Memo1 vom Typ String sein!

procedure TForm1.FormActivate(Sender: TObject);
// Bildung eines "leeren" zweidimensionale Feldes von Zeichen
var
  i: Byte;
begin
  // max. Spaltenanzahl
  for i := 1 to maxSpalten do Zeile[i] := ' ';
  // max. Linienzahl
  for i := 1 to maxLinien do Memo1.Lines.Add(Zeile);
end;

procedure TForm1.WriteMemo(ZeNr, SpNr: Byte; Ch: Char);
// Zusammenfassung der GOTO-Anweisung mit dem Schreibvorgang
begin
  ZStr := Memo1.Lines[ZeNr];
  Insert(Ch, ZStr, SpNr);
  Memo1.Lines[ZeNr] := ZStr;
end;

Aufrufbsp.:

Delphi-Quelltext
1:
2:
  ZeNr := 10; SpNr := 15;
  WriteMemo(ZeNr, SpNr, 'X');

Nochmals danke.

Bernd, alias OeBe

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt


icho2099 - Fr 11.02.22 17:01

bedenke: das insert macht deine Zeile länger, das möchtest du vielleicht nicht.