text nur zum teil ausgeben?

Für Fragen von Einsteigern und Programmieranfängern...

text nur zum teil ausgeben?

Beitragvon reiter » 12. Sep 2018, 05:17 text nur zum teil ausgeben?

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
reiter
 
Beiträge: 63
Registriert: 18. Nov 2017, 16:58

Beitragvon Linkat » 12. Sep 2018, 07:07 Re: text nur zum teil ausgeben?

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
Linkat
 
Beiträge: 388
Registriert: 10. Sep 2006, 22:24
Wohnort: nr Stuttgart
OS, Lazarus, FPC: Linux Mint 18.3 64 bit; Lazarus 1.8.0 FPC 3.0.4; Raspbian, Windows 7 | 
CPU-Target: AMD 64Bit, ARM 32Bit
Nach oben

Beitragvon reiter » 12. Sep 2018, 08:04 Re: text nur zum teil ausgeben?

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
reiter
 
Beiträge: 63
Registriert: 18. Nov 2017, 16:58

Beitragvon wp_xyz » 12. Sep 2018, 08:30 Re: text nur zum teil ausgeben?

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.
wp_xyz
 
Beiträge: 2616
Registriert: 8. Apr 2011, 08:01

Beitragvon reiter » 12. Sep 2018, 08:35 Re: text nur zum teil ausgeben?

vielen dank...
ihr seit die besten...
funktioniert nun
reiter
 
Beiträge: 63
Registriert: 18. Nov 2017, 16:58

Beitragvon Linkat » 12. Sep 2018, 08:38 Re: text nur zum teil ausgeben?

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,[' ']);
 
Linkat
 
Beiträge: 388
Registriert: 10. Sep 2006, 22:24
Wohnort: nr Stuttgart
OS, Lazarus, FPC: Linux Mint 18.3 64 bit; Lazarus 1.8.0 FPC 3.0.4; Raspbian, Windows 7 | 
CPU-Target: AMD 64Bit, ARM 32Bit
Nach oben

Beitragvon reiter » 12. Sep 2018, 09:00 Re: text nur zum teil ausgeben?

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"
reiter
 
Beiträge: 63
Registriert: 18. Nov 2017, 16:58

Beitragvon wp_xyz » 12. Sep 2018, 09:25 Re: text nur zum teil ausgeben?

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".
wp_xyz
 
Beiträge: 2616
Registriert: 8. Apr 2011, 08:01

Beitragvon reiter » 12. Sep 2018, 10:33 Re: text nur zum teil ausgeben?

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: 63
Registriert: 18. Nov 2017, 16:58

Beitragvon reiter » 12. Sep 2018, 11:06 Re: text nur zum teil ausgeben?

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
reiter
 
Beiträge: 63
Registriert: 18. Nov 2017, 16:58

Beitragvon wp_xyz » 12. Sep 2018, 11:17 Re: text nur zum teil ausgeben?

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;
wp_xyz
 
Beiträge: 2616
Registriert: 8. Apr 2011, 08:01

Beitragvon reiter » 12. Sep 2018, 11:48 Re: text nur zum teil ausgeben?

danke,
mit deiner letzten erklärung kann ich das auch nachvollziehen
supi
nochmal danke...
reiter
 
Beiträge: 63
Registriert: 18. Nov 2017, 16:58

Beitragvon reiter » 13. Sep 2018, 20:24 Re: text nur zum teil ausgeben?

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
reiter
 
Beiträge: 63
Registriert: 18. Nov 2017, 16:58

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried