Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit ComboBox (https://www.delphipraxis.net/168842-probleme-mit-combobox.html)

Drahcir 13. Jun 2012 18:48

Probleme mit ComboBox
 
Da ich nach langer Suche nichts gefunden habe, möchte ich hier einmal nachfragen.
Ich hoffe ich bin hier richtig :?

Mein Programm soll einen Text aus einem Memo-Feld Zeile für Zeile auslesen, nach bestimmten Wortblöcken suchen, wenn diese gefunden wurden an Anfang der Zeile die ersten 10 Zeichen auslesen, in die Variable Datum schreiben und diese dann in eine Combobox namens cbLogins eintragen als Items.

Hier mal der Code:

Delphi-Quellcode:
procedure TfrmMain.btMehrInformationenClick(Sender: TObject);
var I, Zeile : Integer;
    Ein, Datum, Uhrzeit, Koordinaten : string;
begin

  for Zeile := 0 to hLogFenster.getAnzahl-1 do begin //getAnzahl entspricht Memo.lines.count;
    ein := hLogFenster.getZeile(Zeile);            // laden der Zeile in var ein;

// eine zu überprüfende Zeile sieht folgend aus ( entspricht nun var ein )
// 2012-04-28 22:12:29 [INFO] Drahcir [/#.###.###.##:#####] logged in with entity id 49095 at (453.375, 64.0, -13.53125)

    if pos('Drahcir', Ein) <> 0                // nach 'Drahcir' soll überprüft werden
    then
      if pos('logged in with entity id', ein) <> 0  // dies soll auch in der zeile stehen
      then begin
        for I := 12 to 19 do Uhrzeit := Uhrzeit + ein[I];    // speichern einer uhrzeit
        Datum := leftStr(Ein,10);                            // Speichern des Datums

        Koordinaten := copy(Ein, pos( '(' , Ein)+1,200);     // Koordinaten werden gespeichert
        Delete(Koordinaten,pos(')',Koordinaten),1);          // Klammer am Ende wird entfernt

        cbLogins.Items.Add(Datum);                           // Laden des "Datums" in combobox
       {Memo1.Lines.Add(Datum);}                              // laden in memo funktioniert!!

        Uhrzeit := '';                                       //zurücksetzen der Uhrzeit

      end; // ende von if pos() <> 0
  end;  // ende der for Zeile := 0 to hLog...
end;
Nun wird (wenn ich im laufenden Programm die Combobox aufklappen lasse) gar nichts mehr angezeigt, auch vorher schon eingetragene Items verschwinden einfach aus der Liste :S

Ich hoffe ihr versteht meine Probleme und könnt mir helfen oder zumindest eine Denkhilfe geben :)

EDIT: hab die forschleife nach
Delphi-Quellcode:
for Zeile := 0 to hLogFenster.getAnzahl-1 do
geändert

Luckie 13. Jun 2012 18:56

AW: Probleme mit ComboBox
 
Delphi-Quellcode:
for Zeile := 0 to hLogFenster.getAnzahl do
Das kann schon mal nicht funktionieren. Da der Zeilenindex nullbasierend ist muss es heißen:
Delphi-Quellcode:
for Zeile := 0 to hLogFenster.getAnzahl-1 do

Drahcir 13. Jun 2012 19:02

AW: Probleme mit ComboBox
 
Vielen Dank für deine Hilfe, damit haben wir ein Problem schonmal beseitigt aber mein genanntes Problem ist noch immer da :(

himitsu 13. Jun 2012 19:55

AW: Probleme mit ComboBox
 
Zitat:

Zitat von Drahcir (Beitrag 1170726)
Vielen Dank für deine Hilfe, damit haben wir ein Problem schonmal beseitigt aber mein genanntes Problem ist noch immer da :(

Da in dem gezeigten Codeschnippsel keinerlei Code enthalten ist, welcher Einträge aus cbLogins löschen könnte
und da irgendwer vergessen hat uns restlichen Code zu zeigen, welcher hier und sonstwo aufgerufen wird.

Also kann dir niemand helfen.



Wie wäre es mit debuggen und schauen wann die Einträge verschwinden, bzw. ob überhaupt jemals welche drin sind?
Wenn diese über Items.Delete gelöscht werden, dann
Delphi-Quellcode:
 function GetItemsClass: TCustomComboBoxStringsClass;
überschreiben und dort eine eigene Klassenableitung übergeben, welche dich informiert, wenn was gelöscht werden soll.

Drahcir 13. Jun 2012 20:35

AW: Probleme mit ComboBox
 
Ich hau hier mal den ganzen Quellcode rein, auch wenn meine Bezeichnungen etwas konfus sind sollte man halbwegs verstehen worum es geht :)

Das mit dem debuggen peil ich nicht so ganz, damit muss ich mich auch nochmal ausführlicher Befassen, sry :(

Aber schön, das in diesem Teil des Codes schonmal kein Fehler vorliegt, da bin ich schon ein wenig erleichter :o

Ich hoffe das der vollständige Code mehr Licht ins Dunkel bringen kann und schonmal vielen Dank für die Mühe und Zeit :)

Delphi-Quellcode:
unit mSpielerDB;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IniFiles, mLogAnzeige, Grids, ComCtrls, Calendar,
  ValEdit, StrUtils;

type
  TfrmMain = class(TForm)
    btSpielersuche: TButton;
    cbSpieler: TComboBox;
    btMehrInformationen: TButton;
    lbweitereInfos: TLabel;
    cbLogIns: TComboBox;
    lbAktualisierung: TLabel;
    Memo1: TMemo;
    procedure btSpielersucheClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btMehrInformationenClick(Sender: TObject);
  private
    ini: TIniFile;
    filename: String;
    hLogFenster : TfrmLogAnzeige;
    zDatum : string;
  public
    { Public-Deklarationen }
  end;

var
  frmMain: TfrmMain;

implementation {$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
var SpielerlisteIni : TIniFile;
    Spielerliste : String;
    I : Integer;
begin
{***** Auslesen einer Spieler.ini, Eintrag der möglichen Spieler in eine Combobox}

  Spielerliste := ExtractFilePath(ParamStr(0)) + 'Spieler.ini';
  SpielerlisteIni := TIniFile.Create(Spielerliste);

  SpielerlisteIni.ReadSection('Spieler', cbSpieler.Items);
  SpielerlisteIni.Free;

{***** Anlegen des Log-Formulars mit Textanzeige *****}
//Achtung: Nach dem Create wird das OpenDialog geöffnet!!!

  hLogFenster := TfrmLoganzeige.Create(frmMain);
  hLogFenster.Show;
end;

procedure TfrmMain.btSpielersucheClick(Sender: TObject);
var SpielerlisteIni : TIniFile;
    Spielerliste : String;
    I : Integer;
begin
  btSpielersuche.Enabled := false;
  cbSpieler.Enabled := false;
  Caption := 'Suche: ' + cbSpieler.Text;

{**** Eventuelles Schreiben eines neuen Charakters in die Spieler.ini}
  Spielerliste := ExtractFilePath(ParamStr(0)) + 'Spieler.ini';
  SpielerlisteIni := TIniFile.Create(Spielerliste);

  SpielerlisteIni.WriteString('Spieler', cbSpieler.Text, '');
  SpielerlisteIni.Free;

{**** Auslesen oder anlegen einer Spielerdatei mit Eintragen des Änderungsdatum}
  If Trim(cbSpieler.Text) <> ''
  Then begin
    filename := ExtractFilePath(ParamStr(0)) + Trim(cbSpieler.Text) + '.ini';
    ini := TIniFile.Create(filename);

    ini.WriteString('Letzte Änderung', 'Datum', DateToStr(Now));
    ini.Free; // freigeben der Spielerspezifischen .ini Datei
  end;
end;

procedure TfrmMain.btMehrInformationenClick(Sender: TObject);
var I, Zeile : Integer;
    Ein, Datum, Uhrzeit, Koordinaten : string;
begin

//Öffnen der Spielerdatei
  filename := ExtractFilePath(ParamStr(0)) + Trim(cbSpieler.Text) + '.ini';
  ini := TIniFile.Create(filename);

  for Zeile := 0 to hLogFenster.getAnzahl-1 do begin
    ein := hLogFenster.getZeile(Zeile);

    if pos(cbSpieler.Text, Ein) <> 0
    then
      if pos('logged in with entity id', ein) <> 0
      then begin
        for I := 12 to 19 do Uhrzeit := Uhrzeit + ein[I];
        Datum := leftStr(Ein,10);

        Koordinaten := copy(Ein, pos('(',Ein)+1,200);
        Delete(Koordinaten,pos(')',Koordinaten),1);

        cbLogins.Items.Add(Datum);
   //     Memo1.Lines.Add(Datum);

        Uhrzeit := '';

      end; // ende von if pos() <> 0
  end;  // ende der for Zeile := 0 to hLog...

// Auslesen der Datei
  lbAktualisierung.Caption := 'Aktualisiert: ' + ini.ReadString('Letzte Änderung', 'Datum', 'Fehler beim Auslesen!');
  ini.ReadSectionValues('Logins', cbLogins.Items);      //Auslesen des Datums

// Freigeben der Datei
  ini.Free;
end;

end.
und hier noch mein mLoganzeige was ab und an genutzt wird ...

Delphi-Quellcode:
unit mLogAnzeige;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmLogAnzeige = class(TForm)
    MemoLogAnzeige: TMemo;
    OpenDialog1: TOpenDialog;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    function getAnzahl: Integer;
    function getZeile(nr : Integer): String;
    procedure Loeschen;
    procedure schreibeZeile(s : String);
  end;

var
  frmLogAnzeige: TfrmLogAnzeige;

implementation {$R *.dfm}

function TfrmLogAnzeige.getAnzahl: Integer;
begin
  getAnzahl := MemoLogAnzeige.Lines.Count
end;

function TfrmLogAnzeige.getZeile(nr : Integer): String;
begin
  getZeile := MemoLogAnzeige.Lines[nr];
end;

procedure TfrmLogAnzeige.Loeschen;
begin
  MemoLogAnzeige.Lines.Clear;
end;

procedure TfrmLogAnzeige.schreibeZeile(s : String);
begin
  MemoLogAnzeige.Lines.Add(s)
end;

procedure TfrmLogAnzeige.FormCreate(Sender: TObject);
begin
  if OpenDialog1.Execute
  then memoLoganzeige.Lines.LoadFromFile(Opendialog1.FileName);
end;

end.
und damit du es ganz genau weißt:

Delphi-Quellcode:
object cbLogIns: TComboBox
    Left = 8
    Top = 120
    Width = 305
    Height = 26
    DropDownCount = 90000
    ItemHeight = 18
    TabOrder = 3
    Text = 'Datum der Logins anzeigen und auswählen'
  end
//EDIT: Das Programm läuft ja einwandfrei durch, keine Fehler und gar nichts, die Daten werden auch in der Variable Datum gespeichert, wieso die dann nicht angezeigt werden ist meine Frage :?

Bummi 13. Jun 2012 21:35

AW: Probleme mit ComboBox
 
ohne wirklich nachvollziehen zu können was da ablaufen soll, diese Stelle
Delphi-Quellcode:
  ini.ReadSectionValues('Logins', cbLogins.Items);
aufgerufen irgendwo nach

Delphi-Quellcode:
cbLogins.Items.Add(Datum);
kann es sein dass Du danach suchst ?

Drahcir 13. Jun 2012 21:44

AW: Probleme mit ComboBox
 
Zitat:

Zitat von Bummi (Beitrag 1170750)
ohne wirklich nachvollziehen zu können was da ablaufen soll, diese Stelle
Delphi-Quellcode:
  ini.ReadSectionValues('Logins', cbLogins.Items);
aufgerufen irgendwo nach

Delphi-Quellcode:
cbLogins.Items.Add(Datum);
kann es sein dass Du danach suchst ?

natürlich ... vielen vielen Dank, hab nicht gemerkt, das ich da ja auch die Combobox anspreche ...
ich hab wohl nur die ini.xxx gelesen und mir nichts dabei gedacht.

Danke für die schnelle Hilfe trotz laufender EM ... :-D

Nächstes mal kontrollier ich wirklich jede Zeile bevor ich mich hier melde, was sicher noch öfter passiert :)

Luckie 13. Jun 2012 21:47

AW: Probleme mit ComboBox
 
Dir ist klar, dass du da ziemlich viele Speicherlecks in deinem Code hast?

Drahcir 13. Jun 2012 22:16

AW: Probleme mit ComboBox
 
Das Programm so bisher war nur ne winzig kleine Idee und ich lerne erst seit einem Jahr Pascal und das auch nur Hobbymäßig alle paar Wochen mal^^

Die Idee kam mir heute morgen im Bus und war nur ne Fix-Idee die ich eigentlich nie vor hatte zu Ende zu führen, jetzt aber doch ein wenig Lust daran gewonnen habe. Wenn du mir noch netterweise erklären magst wo ich überall Fehler drinnen habe wär das ganz nett^^

Luckie 13. Jun 2012 22:27

AW: Probleme mit ComboBox
 
Du gibst zum Beispiel die ganzen Ini-Objekte nicht wieder frei.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz