[Delphi] Memo add letters

Pagina: 1
Acties:

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 10-09 14:04
Ik kan alleen scripts en voorbeelden vinden die zeggen:

memo1.lines.add('blaat');

maar ik wil alleen een letter toevoegen. geen extra lijn.

(in pascal heb je dus: write en writeln, en ik heb write nodig)

Dit: memo1.lines.Add(Socket.ReceiveText);
moet dus anders worden.
En hoe kan ik Socket.ReceiveText bekijken zodat ik IF / ELSE constructies kan maken?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Je kunt een letter toevoegen aan je Memo door deze aan een lijn toe te voegen:
Memo1.Lines.Strings[0] := Memo1.Lines.Strings[0] + 'X';

Maar volgens mij is het beter (zoals Indy het doet met TCP) om een buffer te gebruiken, en na een EOL (#13#10?) de lijn toevoegen aan je log.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Ik heb Delphi helaas niet bij de hand, maar mischien moet je proberen een bestaande regel te wijzigen. Gewoon veranderen in 'oude tekst' + 'letter'.

Dus:
code:
1
2
n = nummer van de regel waar je een letter wilt toevoegen
memo1.lines[n] := memo1.lines[n] + Socket.ReceiveText;

Ik weet niet of dit werkt, maar wees creatief!

edit:

oeps :D, jelmervos was me voor.

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 10-09 14:04
Op vrijdag 08 maart 2002 19:05 schreef jelmervos het volgende:

Maar volgens mij is het beter (zoals Indy het doet met TCP) om een buffer te gebruiken, en na een EOL (#13#10?) de lijn toevoegen aan je log.
En (#13#10?) is een enter?

Verwijderd

CR/LF. Windows enter.

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 10-09 14:04
Waarom werkt dit niet?
code:
1
2
3
4
5
6
7
8
9
10
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  if (Socket.ReceiveText = 'Enter') then begin
    memo1.lines.add('');
  end else begin
    memo1.lines[1] := memo1.lines[1] + Socket.ReceiveText;
    memo1.lines.Add(Socket.ReceiveText);
  end;
end;

De text die verzonden wordt is echt 'Enter'
Hij laat in deze constructie niets zien.
Als ik de if else constructie weglaat, en dat ik dan dit over hou:

memo1.lines[1] := memo1.lines[1] + Socket.ReceiveText;
memo1.lines.Add(Socket.ReceiveText);

werkt hij wel.

Weet iemand de oplossing?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Probeer het es met een extra string variable waar je Socket.Receive text in doet aan het begin en die gebruik je in je IF en Memo code-lines.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

of:

Memo1.Text := Memo1.Text + letter;

  • wizl
  • Registratie: Maart 2001
  • Laatst online: 27-02-2023

wizl

hmmz

Klopt toch, als jij ENTER stuurt, voegt 'ie nix toe aan de Memo, of begrijp ik het nou verkeerd?

Maak anders van die Memo1.Lines.Add(#13#10);

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Volgens mij krijgt hij ook niks in die Memo als ie GEEN 'Enter' stuurt.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 12-09 21:49

Delphi32

Heading for the gates of Eden

Op vrijdag 08 maart 2002 22:17 schreef Cheater het volgende:
Waarom werkt dit niet?
code:
1
2
3
4
5
6
7
8
9
10
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  if (Socket.ReceiveText = 'Enter') then begin
    memo1.lines.add('');
  end else begin
    memo1.lines[1] := memo1.lines[1] + Socket.ReceiveText;
    memo1.lines.Add(Socket.ReceiveText);
  end;
end;

De text die verzonden wordt is echt 'Enter'
Hij laat in deze constructie niets zien.
Als ik de if else constructie weglaat, en dat ik dan dit over hou:

memo1.lines[1] := memo1.lines[1] + Socket.ReceiveText;
memo1.lines.Add(Socket.ReceiveText);

werkt hij wel.

Weet iemand de oplossing?
Voor zover ik weet (ik werk voornamelijk met de Indy components) is de ReceiveText property eigenlijk een function, die de buffer uitleest en daarna reset. Daarom werkt een if-then-else over de ReceiveText niet.
Oplossing: voor je if-then de boel cachen in een lokale variabele, en dan vergelijken over de variabele, NIET de ReceiveText.

  • nulkelvin
  • Registratie: Maart 2000
  • Laatst online: 09-06-2021

nulkelvin

ehmm is er nog koffie?

Kan je niet beter de Memo1.Text variabele gebruiken want alle lijntjes van je memo veld inclusief enters staan in 1 grote string, kan je meteen die #13#10 er ook invoegen en maakt ie zelf genoeg regels aan.

ik wilde dat ik eens een coole sig. kon bedenken.


  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 10-09 14:04
laten we het even niet hebben over #13#10
Mijn clientapp geeft het woord enter door, en dat ontvang mijn server. hij geeft dus geen VK_RETURN door ofzo, nee, gewoon 'enter'. (Lees wat er op jou entertoets staat. :P.

Is Socket.ReceiveText een string? of ...

Want ik snap nog steeds niet of ik een IF ELSE constructie kan toepassen zoals dat staat in mijn 3e post in dit TOpic

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Socket.ReceiveText is een function die de huidige buffer terug geeft. Blijkbaar leegt deze direct die buffer weer.

Dus als jij dit doet:
if Socket.ReciveText = 'enter' then ...

dan zal de buffer leeg zijn, en zal de volgende ReceiveText (meestal) niks terug geven. Iig niet wat je wilt.


Oplossing: stop de ReceiveText in een lokale variable en ga daar verder mee werken.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op zaterdag 09 maart 2002 00:15 schreef deur het volgende:
of:

Memo1.Text := Memo1.Text + letter;
Is leuk voor een enkele letter, maar wordt erg traag als er veel tekens in het memoveld staan
code:
1
2
3
4
for i := 0 to 100000 do
begin
  Memo1.Text := Memo1.Text + 'A';
end

Aan het eind worden er dus steed bijna 100000 tekens geschreven. Gaat erg lang duren
Pagina: 1