Autor Beitrag
OeBe
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 04.02.22 15:47 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 04.02.22 18:17 
Es gibt bei einem 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.

Für diesen Beitrag haben gedankt: OeBe
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Sa 05.02.22 00:09 
Wenn das Memo einen FixedFont aufweist, wird wohl das hier wie kann ich "gehe zu zeile"-funktion realisieren 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 05.02.22 20:26 
Du könntest das Memo von SynEdit nehmen. Da gibt es auch direkt die Koordinatenfunktion.

Für diesen Beitrag haben gedankt: OeBe
OeBe Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 10.02.22 10:01 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Es gibt bei einem 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):
ausblenden 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.:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 101
Erhaltene Danke: 12

WIN XP, WIN 7, WIN 10
Delphi 6 Prof, Delphi 2005, FPC
BeitragVerfasst: Fr 11.02.22 17:01 
bedenke: das insert macht deine Zeile länger, das möchtest du vielleicht nicht.