text nur zum teil ausgeben?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

text nur zum teil ausgeben?

Beitrag von reiter »

hallo ich habe mal ne frage...
ich lese in ein editfeld aus einer listbox text ein der so aussieht

dasisteintest - dernichtfunktioniert

procedure TForm1.ListBox6Click(Sender: TObject);
begin
edit5.Text:=ListBox6.GetSelectedText;
end;

da liest er mir den ganzen text ein

nun möchte ich aber nur den ersten teil einlesen bis zum leerzeichen
bei einem stringgrid kann man mit delimeter was machen das weiss ich
z.b.
StringGrid2.Rows[1].Delimiter :=' ';

aber wie funktioniert das wenn ich das in ein editfeld einlesen möchte das der text ab dem leerzeichen abgeschnitten wird?
kann mir da mal jemand helfen?

danke schon mal im vorraus

Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Re: text nur zum teil ausgeben?

Beitrag von Linkat »

Hallo reiter,
versuche es mal mit der Funktion ExtractDelimited aus der unit StrUtils:

Definition:

Code: Alles auswählen

function ExtractDelimited(n:Integer;const s:String;const Delims:TSysCharSet):String;
 


angewand an dein Beispiel:

Code: Alles auswählen

uses StrUtils;
....
edit5.Text:=ExtractDelimited(1,'dasisteintest - dernichtfunktioniert',[' ']);
 
oder
 
edit5.Text:=trim(ExtractDelimited(1,'dasisteintest - dernichtfunktioniert',['-']));       //<-- Trim entfernt das Leerzeichen am Ende
 

Viel Errfolg.

Gruß, linkat
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: text nur zum teil ausgeben?

Beitrag von reiter »

irgendwie macht er das nicht...und bringt mir einen fehler
StrUtils ist in uses eingetragen


function ExtractDelimited(n:Integer;const s:String;const Delims:TSysCharSet):String;

procedure TForm1.ListBox6Click(Sender: TObject);
begin
edit5.Text:=ExtractDelimited(1,ListBox6.GetSelectedText,[' ']);
end;


unit1.pas(326,17) Fatal: Syntax error, ";" expected but "." found

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: text nur zum teil ausgeben?

Beitrag von wp_xyz »

Oder nimm doch Pascal-Grundfunktionen:

Code: Alles auswählen

var
  p: Integer;
begin
  p := pos(' ', ListBox6.GetSelectedText);
  if p > 0 then
    Edit5.Text := Copy(Listbox6.GetSelectedText, 1, p-1)
  else
    Edit5.Text := Listbox6.GetSelectedText;

Wegen des Fehlers 'unit1.pas(326,17) Fatal: Syntax error, ";" expected but "." found': Linkat's Code ist in Ordnung, der Fehler liegt irgendwo anders, aber wo, das kann man nur sagen, wenn man den ganzen Quelltext kennt. Schau dir die Zeile 326 an, dort meckert der Compiler.

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: text nur zum teil ausgeben?

Beitrag von reiter »

vielen dank...
ihr seit die besten...
funktioniert nun

Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Re: text nur zum teil ausgeben?

Beitrag von Linkat »

wahrscheinlich darfst du nur einen String an ExtractDelimited übergeben, also erst:

Code: Alles auswählen

var s:String;
...
s:=ListBox6.GetSelectedText;
edit5.Text:=ExtractDelimited(1,s,[' ']);
 
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: text nur zum teil ausgeben?

Beitrag von reiter »

super , danke

darf ich noch ne andere frage hier stellen oder einen neuen thread für auf machen?
wenn das nicht passt bitte ich die admins das zu verschieben

hängt aber damit zusammen

also aus der liste wird das jetzt richtig übergeben wie ich das will an edit5 (danke euch)
jetzt hab ich noch ne funktion auf einen button ausführen gelegt wo das was in edit5 steht verarbeitet wird das funktioniert auch auf form1

jetzt habe ich eine form2 erstellt (eine abfrage ausführen oder abbruch) und die Form2 in die uses auf der form1 eingetragen
der button6 öffnet mir jetzt mit form2.show die form und habe dann auf den button ausführen in der form2 meinen befehl gelegt (der in der form1 funktioniert)

also es wird alles korekt ausgeführt bis ich auf den button ausführen in der form2 klicke

da sagt er mir aber dann als fehler das er das edit5 nicht findet und den befehl für das ausführen auch nicht

hier leitet er auf die form2

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
Form2.show;
end;



unit Unit2;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons,
StdCtrls;

type

{ TForm2 }

TForm2 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Label1: TLabel;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private

public

end;

var
Form2: TForm2;

implementation

{$R *.lfm}

{ TForm2 }

procedure TForm2.BitBtn2Click(Sender: TObject);
begin
Command:= 'opkg remove'+' '+Edit5.Text+ #10;
Memo1.Append('*** Sending ' + Command);
Memo1.Append('*** Begin result****');
Memo1.Append(comm.CommandResult(Command));
Memo1.Append('*** End result****');
Memo1.Append('');
end;

procedure TForm2.BitBtn1Click(Sender: TObject);
begin
close;
end;

end.

fehlermeldung

Projekt kompilieren, Ziel: Enigma2_BoxControl: Exit code 256, Fehler: 10
unit2.pas(38,3) Error: Identifier not found "Command"
unit2.pas(38,31) Error: Identifier not found "Edit5"
unit2.pas(39,3) Error: Identifier not found "Memo1"
unit2.pas(39,33) Error: Identifier not found "Command"
unit2.pas(40,3) Error: Identifier not found "Memo1"
unit2.pas(41,3) Error: Identifier not found "Memo1"
unit2.pas(41,16) Error: Identifier not found "comm"
unit2.pas(41,35) Error: Identifier not found "Command"
unit2.pas(42,3) Error: Identifier not found "Memo1"
unit2.pas(43,3) Error: Identifier not found "Memo1"

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: text nur zum teil ausgeben?

Beitrag von wp_xyz »

command soll wahrscheinlich eine lokale Variable von TForm2.BitBtn2Click sein - ist aber nirgendwo deklariert, also:

Code: Alles auswählen

procedure TForm2.BitBtn2Click(Sender: TObject);
var
  Command: String;
begin
  Command := 'opk remove' + ' ' + Edit5.Text// warum ist hier #10 angehängt?
  Memo1.Append('....');
  ...

Edit5 ist auf TForm2 auch nirgendwo vorhanden und wird daher nicht gefunden, genausowenig wie Memo1. Falls diese auf einem anderen Formular vorhanden sind, musst du dessen Namen voranstellen, also

Code: Alles auswählen

  ...
  Command := 'opk remove' + ' ' + Form1.Edit5.Text;
  ...

Ist aber meiner Ansicht nach schlechter Programmierstil, weil TForm2 dann nur funktioniert, wenn eine Form1 vorhanden ist. Besser ist z.B. TForm2 ein Property a la

Code: Alles auswählen

type
  TForm2 = class(TForm)
    procedure BitBtn2Click(Sender: TObject);
  private
    FCmdParameter: String;
  public
    property CmdParameter: String read FCmdParameter write FCmdParameter;
  end;
 
  procedure TForm2.BitBtnClick(Sender: TObject);
  var
    Command: String;
  begin
    Command := 'opkg remove ' + FCmdParameter;
    ...

zu definieren, diesem beim Erzeugen von Form2 oder an passender anderer Stelle den Text von Edit5 zuzuweisen. In dieser Konstruktion wäre TForm2 autark und müsste nichts von den anderen Formularen wissen.

Ziel sollte sein, dass die Formulare sich untereinander möglichst wenig kennen, sonst landest zu bei größeren Projekten sehr schnell bei zirklären Unit-Abhänigkeiten.

Wie das mit dem Memo1 zu lösen ist, überlasse ich dir aus "Hausaufgabe".

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: text nur zum teil ausgeben?

Beitrag von reiter »

danke,
ja mag schlecht sein... bin ja noch am lernen...
aber schön wenn jemand einem mal paar tips gibt wie es besser geht

danke

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: text nur zum teil ausgeben?

Beitrag von reiter »

bei deiner zeile aus deinem code

Command := 'opkg remove ' + FCmdParameter;

wo wird da denn das edit5.text angesprochen?
er compiliert es zwar durch macht es aber nicht

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: text nur zum teil ausgeben?

Beitrag von wp_xyz »

reiter hat geschrieben:bei deiner zeile aus deinem code

Command := 'opkg remove ' + FCmdParameter;

wo wird da denn das edit5.text angesprochen?
er compiliert es zwar durch macht es aber nicht

Ich habe nicht alles im Code geschrieben, weil ich nicht weiß wo TForm2 erzeugt wird, und wo Edit5 sich befindet, und entsprechende Annahmen vermeiden wollte. Nun also doch: Angenommen, Edit5 befindet sich auf Form1 (Typ TForm1), und TForm1 hat eine Methode "Form2Aufrufen" (sorry einen besseren Namen habe ich nicht...). Hier wäre ein guter Punkt, wo Form1 dem CmdParameter von Form2 seinen Edit5.Text zuweisen könnte. Auf diese Weise braucht nur Form1 Form2 zu kennen (das ist unvermeidbar, denn Form2 wird ja von Form1 aus angezeigt), aber Form2 muss Form1 NICHT kennen. d.h. die unit mit Form2 kommt ohne ein "uses form1unit" aus, was die Gefahr einer zirkulären Abhängigkeit reduziert:

Code: Alles auswählen

procedure TForm1.Form2Aufrufen;
begin
  Form2.CmdParameter := Edit5.Text;
  Form2.Show;
end;

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: text nur zum teil ausgeben?

Beitrag von reiter »

danke,
mit deiner letzten erklärung kann ich das auch nachvollziehen
supi
nochmal danke...

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: text nur zum teil ausgeben?

Beitrag von reiter »

Ich hab das probiert form1.edit5.text
Form1 wird nicht erkannt Fehler beim compilieren

Dann mit FCmdParameter probiert , wird durch compiliert aber der Parameter wird nicht aufgerufen

edit: jetzt funktioniert es
hatte die uses unit1; vergessen

danke nochmal für eure hilfe

Antworten