AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

strings einer combobox vergleichen

Ein Thema von neroo · begonnen am 6. Apr 2019 · letzter Beitrag vom 7. Apr 2019
Antwort Antwort
Seite 1 von 3  1 23   
neroo

Registriert seit: 5. Okt 2018
7 Beiträge
 
#1

strings einer combobox vergleichen

  Alt 6. Apr 2019, 14:19
Hallo,

ich möchte hier nachdem ich die Datei eingelesen haben, die erste spalte der Tabelle zu einer combobox hinzufügen.
Dies mache ich mit dem Befehl combobox.items.add(); aber ich möchte hier die mehrmals vorkommenden strings löschen,
sodass ein string nur einmal vorkommt. Leider komme ich hier nicht weiter. ich wäre dankbar für die Hilfe.

Code:
unit Datei;

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    schliess_knopf: TButton;
    einlesen_knopf: TButton;
    s_standortname: TComboBox;
    Label1: TLabel;
    oeffnen_knopf: TButton;
    ende_knopf: TBitBtn;
    fuss: TStatusBar;
    OpenDialog: TOpenDialog;
    etabelle: TStringGrid;
    procedure beenden(Sender: TObject);
    procedure einlesen(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure schliessen(Sender: TObject);
  end;

var Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

var anzahl: integer;
    datei_name: string;
    datei: textfile;
procedure TForm1.FormShow(Sender: TObject);
begin
  datei_name:='d:\temp\windenergie01.csv';
  with etabelle do
    begin
      Cells[1,0]:='Standort';
      Cells[2,0]:='Windrad';
      Cells[3,0]:='Nennleistung';
      Cells[4,0]:='Datum';
      Cells[5,0]:='Energiemenge';
    end;

  //
end;

procedure TForm1.schliessen(Sender: TObject);
begin
  //
end;

procedure TForm1.beenden(Sender: TObject);
begin
  close;
end;

procedure TForm1.einlesen(Sender: TObject);
var i,posi: integer;
    maxi,wert: double;

    buffer,eintrag,s1,s2,s3,s4,s5: string;
    ok: boolean;
begin
  with opendialog do
    begin
      title:='Windenergie einlesen';
      filename:=datei_name;
      initialdir:=extractfilepath(datei_name);
      filter:='Windenergieergebnisse (*.csv)|*.csv|alle Dateien (*.*)|*.*';
    end;
  if opendialog.execute then
    begin
      datei_name:=opendialog.filename;
      assignfile(datei,datei_name);
      {$I-}
      reset(datei);
      readln(datei);
      i:=0;
      while not(eof(datei)) do
        begin
          inc(i);
          readln(datei,eintrag);
          //Suedkueste,ElCedro2,3.4MW,01.02.2017,4092kWh
          posi:=pos(',',eintrag);
          s1:=copy(eintrag,1,posi-1);
          delete(eintrag,1,posi);
          //ElCedro2,3.4MW,01.02.2017,4092kWh
          posi:=pos(',',eintrag);
          s2:=copy(eintrag,1,posi-1);
          delete(eintrag,1,posi);
          //3.4MW,01.02.2017,4092kWh
          posi:=pos(',',eintrag);
          s3:=copy(eintrag,1,posi-1);
          delete(eintrag,1,posi);
          //01.02.2017,4092kWh
          posi:=pos(',',eintrag);
          s4:=copy(eintrag,1,posi-1);
          delete(eintrag,1,posi);
          //4092kWh
          s5:=eintrag;


          //
          with etabelle do
            begin
              if i>=rowcount then rowcount:=rowcount+1;
              cells[1,i]:=s1;
              cells[2,i]:=s2;
              cells[3,i]:=s3;
              cells[4,i]:=s4;
              cells[5,i]:=s5;
            end;
          //standortname in combobox schreiben
            d1:=s1;
            s_standortname.Items.Add(etabelle.Cells[1,i]);

          //--

          //
        end;
      closefile(datei);
      {$I+}
      ok:=(ioresult=0);
      //--


      //--
    end;

end; //einlesen



end.
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
143 Beiträge
 
#2

AW: strings einer combobox vergleichen

  Alt 6. Apr 2019, 17:21
Moin,

wahrscheinlich gibt es 1000 bessere Lösungen aber wie wäre es damit

Delphi-Quellcode:
 
function NameBereitsVorhanden(const SuchString: String): Boolean;
var
  i: integer;
  gefunden: Boolean;
begin
  gefunden := false;
  for i := 0 to ETabelle.Count -1 do
  begin
    if SuchString := ETabelle:.String[i] then gefunden := true;
  end;
  Result := gefunden
end;

         //
          with etabelle do
            begin
              if i>=rowcount then rowcount:=rowcount+1;
              cells[1,i]:=s1;
              cells[2,i]:=s2;
              cells[3,i]:=s3;
              cells[4,i]:=s4;
              cells[5,i]:=s5;
            end;
          //standortname in combobox schreiben
            d1:=s1;
            if not NameBereitsVorhanden(etabelle.Cells[1,i]) then s_standortname.Items.Add(etabelle.Cells[1,i]);
Das ist Pseudo-Code - also nicht kopieren, aber der Ansatz ist eine Idee

gruß
hans
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.267 Beiträge
 
Delphi 7 Professional
 
#3

AW: strings einer combobox vergleichen

  Alt 6. Apr 2019, 17:42
Delphi-Quellcode:
          //standortname in combobox schreiben
          d1:=s1;
          if s_standortname.Items.IndexOf(etabelle.Cells[1,i]) < 0 then begin
            s_standortname.Items.Add(etabelle.Cells[1,i]);
          end;
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
354 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: strings einer combobox vergleichen

  Alt 6. Apr 2019, 17:53
Du schreibst, dass du die Einträge einzeln zu deiner Combobox hinzufügst. In diesem Fall könntest du eine Proc schreiben, welche überprüft, ob neuereintrag bereits in der Liste vorkommt oder nicht:

Delphi-Quellcode:
if combobox.Items.IndexOf( neuereintrag ) < 0 then
  combobox.Items.Add( neuereintrag );
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: strings einer combobox vergleichen

  Alt 6. Apr 2019, 18:39
Hat die Combobox nicht sogar eine Eigenschaft, die man nutzen kann, dass sie keine Doubletten beinhaltet?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
354 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: strings einer combobox vergleichen

  Alt 6. Apr 2019, 18:56
Kann sein, ich kenn's nur von TStringList - dort über .Duplicates := dupIgnore; aber nur (wieso dem so ist, weiss wohl nicht mal die Firma) wenn die Elemente sortiert sind, also .Sorted := true;

Also etwa so:

Delphi-Quellcode:
  hs := TStringList.Create;
 try
  hs.Sorted := true;
  hs.Duplicates := dupIgnore;
  hs.Text := combobox1.items.Text;
  combobox1.Items.Text := hs.Text;
 finally
  hs.Free;
 end;
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.457 Beiträge
 
Delphi 5 Professional
 
#7

AW: strings einer combobox vergleichen

  Alt 6. Apr 2019, 18:57
Das dachte ich zuerst auch. Sieht aber so aus, als gäbe es da nur TStringList.Duplicates. Da TComboBox.Items aber vom Typ TStrings ist, gibt's da offenbar kein simples Property, um Duplikate zu verhindern. Daher ist die Variante mit TComboBox.Items.IndexOf wohl ein einfacher Workaround. Oder man erweitert TComboBox mit einer Ableitung um eine Methode, die die Existenz eines Strings in der Liste prüft.

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: strings einer combobox vergleichen

  Alt 6. Apr 2019, 19:08
Ah. OK. Ich hatte nur im Hinterkopf, dass da was war.

Warum aber nicht erst alles in eine Stringliste packen und diese dann der Combobox zuweisen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.267 Beiträge
 
Delphi 7 Professional
 
#9

AW: strings einer combobox vergleichen

  Alt 6. Apr 2019, 19:22
Ah. OK. Ich hatte nur im Hinterkopf, dass da was war.

Warum aber nicht erst alles in eine Stringliste packen und diese dann der Combobox zuweisen?
Weil TStringList intern die Methoden nutzt, die es von TStrings geerbt hat.

Man landet also in beiden Fällen zur Suche nach Dubletten bei IndexOf. Dann kann man es auch direkt verwenden
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
16.660 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: strings einer combobox vergleichen

  Alt 6. Apr 2019, 19:29
Lade die Liste erst mit dupIgnore in eine TStringsList und kopiere das Ergebnis dann EnBlock in die ComboBox.
Ist auch noch viel schneller als die Strings einzeln in die ComboBox zu bringen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf