Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Idee für Auswahlfunktion (https://www.delphipraxis.net/170910-idee-fuer-auswahlfunktion.html)

DelphiUser1 9. Okt 2012 23:33

Idee für Auswahlfunktion
 
Hallo allerseits, ich habe heute eine Frage zu der Umsetzung für eine Auswahlfunktion.
Der User gibt in ein Edit-Feld den Namen der gesuchten Person ein. Bisher habe ich alle Personen die diesen Namen tragen einfach in ein Memofeld ausgeben lassen.
Jetzt will ich aber, dass der Benutzer eine übersichtliche Auswahlfunktion vorgesetzt bekommt, in der das Bild und der Name der Person zu sehen ist und wo er auf die entsprechenden Personen klicken kann um auf die Seite des jeweiligen zu kommen.
Hat Irgendjemand eine Idee welche Komponente dafür geeignet wäre bzw. wie man so etwas mit schönem Design und anschaulich gestalten kann?

Popov 10. Okt 2012 00:12

AW: Idee für Auswahlfunktion
 
Statt Editfeld nimmst du Combobox oder Listbox. Unter Style (bei Combobox Voreinstellung csDropDown, bei Listbox lbStandard) ändern in csOwnerDrawFixed oder lbOwnerDrawFixed und schon hast du Zugriff auf OnDrawItem und kannst du alles in das Item Zeichnen.

//Edit:

Hier ein kleines Beispiel für Listbox. Vorausgesetzt in der Listbox befinden sich Dateipfade und man hat die Funktion GetIconFromFile, werden die Pfade (obwohl immer noch vorhanden) als Dateinamen ausgegeben und die passenden Icons werden davorgestellt. Die sind hier zwar nur 16x16, man kann die Bilder aber auch größer machen.

Delphi-Quellcode:
procedure TfListBox_FileBox1.ListBox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  TopDifTxt, TopDifIco: Integer; // Gleicht die Höhendifferenz aus
  FileName: String;
begin
  with (Control as TListbox) do
  begin
    if odSelected in State then
      Canvas.Font.Color := clInactiveCaptionText
    else
      Canvas.Font.Color := clWindowText;

    FileName := ExtractFileName(Items[Index]);

    TopDifTxt := (ItemHeight div 2) - (Canvas.TextHeight(Items[Index]) div 2);
    TopDifIco := (ItemHeight div 2) - (16 div 2);

    Canvas.TextRect(Rect, Rect.Left + 16 + 2 + 2, Rect.Top + TopDifTxt,
      ExtractFileName(Items[Index]));

    Canvas.Draw(Rect.Left + 2, Rect.Top + TopDifIco,
      GetIconFromFile(Items[Index], True));
  end;
end;
Es wird so bei dir nicht funktionieren, denn da fehlen paar Funktionen, aber das Prinzip ist erkennbar

nuclearping 10. Okt 2012 01:59

AW: Idee für Auswahlfunktion
 
Das Ganze lässt sich auch über den VirtualStringTree gut realisieren.

DelphiUser1 10. Okt 2012 10:06

AW: Idee für Auswahlfunktion
 
Danke erstmal für die Mühe, aber gibt es nicht noch eine schönere Methode. Also dieses Art und Weise hätte ich mir jetzt für den Notfall aufgehoben, weil ich sie nicht so anschaulich finde. Also mein Projekt ist im Prinzip ein Social Network und da lege ich doch sehr viel Wert auf das Design :wink:

Popov 10. Okt 2012 12:38

AW: Idee für Auswahlfunktion
 
Was meinst du mit Schönere? Die Anderen machen es auch nicht anders. Damit ist alles möglich, in allen Formen und allen Farben. Bist du sicher, dass du die Tipps verstanden hast?

DelphiUser1 10. Okt 2012 21:58

AW: Idee für Auswahlfunktion
 
Ich hab die Tipps schon verstanden, aber ich will einfach was anderes, also wenn jemand noch eine andere Idee hat..

Bummi 10. Okt 2012 22:37

AW: Idee für Auswahlfunktion
 
-Ein DBCtrlGrid mit Bildern und Infotexten kombiniert mit DB-Filtern ....
-"mundgeblasene" Klassen die Dir die Infos auf ein beliebiges Canvas Rendern
-ein Cards-View im cxGrid (von TMS gibt es etwas ähnliches)
-dynamisch erstelltes HTML in einem TWebbrowser

ich schätze Deine Frage ist zu allgemein gestellt bei vermutlich recht genauen Vorstellungen Deinerseits wie es aussehen und funktionieren soll....

DelphiUser1 10. Okt 2012 23:22

AW: Idee für Auswahlfunktion
 
Ja also wenn man so will, dann möchte ich im Prinzip so etwas wie das Personen-Such-System in Facebook

Popov 11. Okt 2012 00:20

AW: Idee für Auswahlfunktion
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also jetzt nicht falsch verstehen, außerdem habe ich verstanden, dass du die Listbox und Combobox ablehnst und respektiere es, aber sage bitte was dir an Listbox und Combobox nicht gefällt. Wenn wir wissen was dir daran nicht gefällt, dann können wir gezielter Tipps geben. Denn wenn ich die Personensuche von Facebook betrachte, dann sehe ich nur eine modifizierte ComboBox.

Der Tipp von Bummi mit Webseite ist auch ok, aber nicht so einfach umzusetzen wenn man es noch nie gemacht hat.

Vielleicht mallst du es auf?

//Edit

Weil ich gerade Urlaub habe und nicht schlafen kann, hier ein Beispiel (siehe Anhang), das in etwa an die FB Suche angelehnt ist.

Furtbichler 11. Okt 2012 06:58

AW: Idee für Auswahlfunktion
 
Ich glaube, es gefällt ihm nicht, weil er dann das Design selbst programmieren muss. Es ist doch auch viel einfacher und schöner, wenn man etwas vorgefertigtes hat, was man einfach nur auf die Form klatschen muss und -wupps- funktiniert alles.

Irgendwo habe ich eine TSocialNetwork-Komponentensammlung gesehen, da konnte man über eine Property ('Design' hieß die) aus 10 verschiedenen Designs wählen. Wo war das doch gleich? :stupid:

sh17 11. Okt 2012 10:44

AW: Idee für Auswahlfunktion
 
Also ich finde VirtualStringTree/VirtualDrawTree auch die beste Wahl. Kann man auch schön mit einer Live-Suche (Beim Tippen schon Ergebnisse einblenden) kombinieren und unter dem Edit einblenden. Noch mehr vorgefertigt ist, denke ich, zu unflexibel. Es sein denn, man kann es nicht.

QuickAndDirty 11. Okt 2012 13:22

AW: Idee für Auswahlfunktion
 
Irgendwer hier im Forum hat mal eine SVG Komponente gemacht. Die würde ich erweitern!

Wegen TWebbrowser:
Das Design lässt sich ja relativ einfach von Webseiten klauen und in eine Art Template umwandeln.
bzw. man benutzt ein Template von http://www.opendesigns.org/
und passt das an.

DelphiUser1 13. Okt 2012 14:32

AW: Idee für Auswahlfunktion
 
@Popov: Ehrlich gesagt habe ich mir das genauso vorgestellt :-D
Ich schätze mal, ich war mir der Vielfältigkeit von Combobox und Listbox nur nicht so bewusst.
Trotzdem habe ich absolut keine Ahnung wie man so etwas mit diesen Komponenten erstellen soll :shock:

Popov 13. Okt 2012 19:37

AW: Idee für Auswahlfunktion
 
An für sich ist das nicht kompliziert, eher nur malen nach Zahlen, d. h. du hast deine Canvas auf der du zeichnest. Das ist fast genauso wie zeichnen auf dem Canvas des Formulars, einer Bitmap oder Image. Allerdings müssen hier vor allem drei Punkte beachtet werden.

Der erste ist, dass du schon auf der richtigen Canvas zeichnen mußt. Als Parameter bekommst du nur
Delphi-Quellcode:
Control: TWinControl
und nicht
Delphi-Quellcode:
TListBox
. Du mußt
Delphi-Quellcode:
Control
also sagen, dass es eine TListbox ist. Das machst du mit
Delphi-Quellcode:
with (Control as TListbox) do
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  with (Control as TListbox) do
  begin
    ...
  end;
end;
Ob du nun mit With arbeitest (mußt du nicht, du kannst aber) oder anders, z. B. so

Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  MyListBox: TListBox;
begin
  MyListBox := (Control as TListbox);
  MyListBox.Canvas. ...
ist eigentlich egal. Beides geht.

Der zweite wichtige Punkt ist, dass du eigentlich auf der ganzen ListBox Canvas zeichnen kannst, aber das willst du ja nicht. Du willst nur auf dem kleinem Streifen des Items zeichnen. Dazu bekommst du den Parameter
Delphi-Quellcode:
Rect: TRect
. Jedes Item hat seinen eigenen Rect Bereich. Du mußt beim Zeichnen also in dem Bereich bleiben.

Die Prozedur
Delphi-Quellcode:
OnDrawItem
funktioniert so: sie wird so oft aufgerufen wie viele Items sichtbar sind. Sind fünf Items sichtbar, wird die Prozedur auch fünf mal aufgerufen. Nur bekommst du jedes Mal passend zu dem Item andere
Delphi-Quellcode:
Rect
Werte. Willst du also an Koordinate 1 und 1 einen Punkt setzten, dann nicht
Delphi-Quellcode:
MyListBox.Canvas.Pixels[1, 1] := clBlack
, sondern
Delphi-Quellcode:
MyListBox.Canvas.Pixels[Rect.Left + 1, Rect.Top + 1] := clBlack
. Du mußt also immer im Verhältnis zu Rect zeichnen. Läßt du es weg, zeichnest du alles oben in der ListBox.

Nur bedenke, man kann auch drüberzeichen in das darunterliegende Item. Die Begrenzung nach unten ist
Delphi-Quellcode:
Rect.Bottom
, nach rechts
Delphi-Quellcode:
Rect.Right
. Also immer schön im im Bereich bleiben und es immer wieder überprüfen. Außerdem sollte man bedenken, dass es auch eine Funktion Rect gibt. Die Namenswahl des Parameters ist nicht sonderlich glücklich, aber auch keine Katastrophe. Man muß eben aufpassen. Wenn eine Fehlermeldung kommt, dann sollte men es nur wissen um was es geht.

Der dritte wichtige Punkt ist, dass man die
Delphi-Quellcode:
State: TOwnerDrawState
Parameter betrachten sollte. Denn die sagen einem was für ein Item das aktuelle Item ist. Ist es ein normales Item oder eine der den Fokus besitz oder ist er gerade selektiert.

Delphi-Quellcode:
  with (Control as TListbox) do
  begin
    if odSelected in State then
      Canvas.Font.Color := clInactiveCaptionText
    else
      Canvas.Font.Color := clWindowText;
Das Beispiel fragt ab ob der Item gerade selektiert ist. In diesem Fall ändert sich die Schriftfarbe. Die Hintergrundfarbe ist schon automatisch in Brush.Color eingestellt. Eigentlich mußt du die Textfarbe und Hintergrundfarbe nicht einstellen, da sie schon voreingestellt sind. Das ist nur dann wichtig wenn du deine eigenen Farben wählen willst. Ansonsten bekommst du die Systemfarben voreingestellt.

Wenn man sein eigenes Design wählen will, dann muß man die Hintergrundfarbe ändern, die Schriftfarbe, dann den Focus löschen und durch seinen eigenen ersetzte. Aber das erkläre ich evt. später, sonst verwirrt das alles nur.

Zuletzt noch der Hinweis, dass
Delphi-Quellcode:
Index: Integer
den Index beinhaltet der bei dem Durchlauf gerade gezeichnet wird.

DelphiUser1 14. Okt 2012 00:14

AW: Idee für Auswahlfunktion
 
Okay danke an Popov schon mal dafür und ich hab mich da auch gleich mal an die Arbeit gemacht. Bin allerdings nicht soo weit gekommen. Vielleicht wäre es hilfreich erst einmal den ganzen Quelltext zu posten und dann zu den einzelnen Schritten etwas zu sagen, weil ich mich leider noch nicht so gut mit Delphi auskenne.

Popov 15. Okt 2012 17:29

AW: Idee für Auswahlfunktion
 
Liste der Anhänge anzeigen (Anzahl: 2)
So, sorry, habe dich übersehen. Hier nun der Sorcecode für das Beispiel vorne. Ich hab den Part mit den Daten heute noch etwas vereinfacht, da ich die Daten vorher in einem Record als Object am Item hatte, was die Sache zwar stark vereinfacht, aber für dich als Anfänger evtl. eine zusätzliche Hürde darstellt. Also habe ich ein anderes Konzept gewählt und alle Daten in einem String zusammengefasst. Das aber nur so nebenbei.

DelphiUser1 16. Okt 2012 22:17

AW: Idee für Auswahlfunktion
 
Okay alles klar, danke dafür.
Ich habe es mir mal angeschaut und verstehe es auch weitestgehend, aber mir ist gerade schleierhaft wie ich jetzt die Daten einbinden kann :?
Also es wird eben abgefragt
Delphi-Quellcode:
if FileExists(path+Edit1.text+'.txt')then
begin
 Listbox1.Items.Add()
Path extrahiert einfach den Filepath (wird im FormCreate deklariert) und was ich mich jetzt frage ist wie ich die daten erfassen kann? Diese werden bislang in "Info(Username).txt" abgespeichert und ich habe diese bisher einfach mit einer Stringlist erfasst und dann ausgegeben. Aber in diesem Fall ist das ganze ein wenig schwieriger wenn ich mich nicht irre. Und kann ich das Bild auch einfach in die Imagelist laden. (Bild = Username.jpg)

Popov 16. Okt 2012 23:08

AW: Idee für Auswahlfunktion
 
Wie du die mit deinen Daten umgehen kannst und welche du hast, das weißt doch du, nicht ich.

Ich hab dir das Beispiel umgeschrieben. Im Item selbst werden hier keine Daten mehr gespeichert. Stattdessen werden die Daten in einem Objekt an den Item gebunden. Die Daten können bei Bedarf gelesen werden, das Item selbst enthält nur noch einen leeren String.

Bei dieser Methode kannst du deine Informationen viel besser verwalten. Du übergibst sie irgendwo an Info und dann greifst du sie bei Bedarf ab. Die Klasse Info vorher an deine Bedürfnissse anpassen. Sie ist simpel gehalten.

Delphi-Quellcode:
type
  TInfo = class
    Name: String;
    Ort: String;
    Freunde: Integer;
    ImageIndex: Integer;
  end;

  {Gibt den X-ten Teilstring eines mit Kommas getrennten Daten-Strings}
function ExtractSubStr(Str: String; Index: Integer): String;
var
  i: Integer;
begin
  Result := '';
  if Index < 1 then Exit;
  Str := Str + ',';
  for i := 1 to Index - 1 do Delete(Str, 1, Pos(',', Str));
  Result := Trim(Copy(Str, 1, Pos(',', Str) - 1));
end;

procedure TForm1.FormCreate(Sender: TObject);

  procedure SetInfo(s: String; var Info: TInfo);
  begin
    Info := TInfo.Create;
    Info.Name := ExtractSubStr(s, 1);
    Info.Ort := ExtractSubStr(s, 2);
    Info.Freunde := StrToIntDef(ExtractSubStr(s, 3), -1);
    Info.ImageIndex := StrToIntDef(ExtractSubStr(s, 4), -1);
  end;

var
  Info: TInfo;
begin
  ListBox1.Style := lbOwnerDrawFixed;

  {Beispieldaten. Letzter Wert Index ist für Bilder in ImageList}
  {SetInfo nur für Übergabe der Beispieldateien. Daten können auch anders an
   Info übergeben werden}
  SetInfo('Anna, Köln, 1, 0', Info);
  ListBox1.Items.AddObject('', Info);

  SetInfo('Kristina, München, 1 , 1', Info);
  ListBox1.Items.AddObject('', Info);

  SetInfo('Sonja, Berlin,,', Info);
  ListBox1.Items.AddObject('', Info);

  SetInfo('Petra, Frankfurt, 5 , 3', Info);
  ListBox1.Items.AddObject('', Info);

  SetInfo('Berbel, Lübeck,, 4', Info);
  ListBox1.Items.AddObject('', Info);

  ListBox1.Font.Name := 'Segoe UI';
  ListBox1.Font.Size := 10;

  ListBox1.ItemHeight := 2 + ImageList1.Height + 2;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  th, tl: Integer;
  i: Integer;
  bmp: TBitmap;
  Info: TInfo;
begin
  with (Control as TListBox) do
  begin
    //Einstellungen für selektierten Item (A)
    if odSelected in State then
      Canvas.Brush.Color := $00EFD3C6; //Helles Blau für selektierte Items

    //Löscht den Item-Canvas
    Canvas.FillRect(Rect);

    //Einstellungen für selektierten Item (B)
    if odSelected in State then
    begin
      Canvas.Pen.Color := $00C66931; //Dunkleres Blau für Fokus-Rand
      Canvas.Brush.Style := bsClear;
      Canvas.Rectangle(Rect);
    end;

    Info := TInfo(Items.Objects[Index]);

    //-Bild 48x48 px aus ImageList zeichnen----------------------------------

    bmp := TBitmap.Create;
    try
      i := Info.ImageIndex;
      if (i > -1) and (i <= Form1.ImageList1.Count - 1) then
      begin
        Form1.ImageList1.GetBitmap(i, bmp);
        Canvas.Draw(Rect.Left + 2, Rect.Top + 2, bmp);
      end;
    finally
      bmp.Free;
    end;

    //-Text-Zeile 1 ausgeben-------------------------------------------------

    //Seitenabstand für Text (rechts vom Bild)
    tl := ItemHeight + 4;
    //Oberkante für Textzeilen. Jeder neue Zeile addiert ihre Höhe dazu
    th := 2;

    Canvas.Font.Style := [fsBold]; //Font-Eigenschaften für aktuelle Zeile
    Canvas.Font.Color := $00C66931; //Blau und fett

    Canvas.TextOut(Rect.Left + tl, Rect.Top + th, Info.Name);
    th := Canvas.TextHeight(#32); //Unterkante alter Text = Oberkante neuer Text

    //-Text-Zeile 2 ausgeben-------------------------------------------------

    Canvas.Font.Style := Canvas.Font.Style - [fsBold]; //-
    Canvas.Font.Color := clWindowText; //Normal

    Canvas.TextOut(Rect.Left + tl, Rect.Top + th, Info.Ort);
    th := th + Canvas.TextHeight(#32); //s. o.

    //-Text-Zeile 3 ausgeben-------------------------------------------------

    Canvas.Font.Size := Canvas.Font.Size - 2; //-
    Canvas.Font.Color := clGray; //Grau und etwas kleiner

    if Info.Freunde > -1 then
      Canvas.TextOut(Rect.Left + tl, Rect.Top + th, Format('%d Gemeinsame Freunde', [Info.Freunde]))
    else
      Canvas.TextOut(Rect.Left + tl, Rect.Top + th, 'Keine gemeinsame Freunde');

    //-------------------------------------------------------------------------

    //Überzeichnet alten Fokus
    if odFocused in State then
      Canvas.DrawFocusRect(Rect);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
begin
  with ListBox1 do //Objekte müssen separat freigegeben werden
    for i := 0 to Items.Count - 1 do
      TInfo(Items.Objects[i]).Free; //Freigeben
end;
Das einzieg auf das du hier achten mußt ist, dass du Items nicht mehr direkt löschen darfst. Vorher mußt du das Objekt freigeben. Abgesehen am Ende. In FormDestroy werden die Objekte automatisch freigegeben.

Was deine Jpeg Daten angeht, so weiß ich nicht ob das mit ImageList geht. Alternativ beim laden in Bmp konvertieren und in Größe 48x48 konvertieren.

DelphiUser1 24. Okt 2012 22:59

AW: Idee für Auswahlfunktion
 
So also mithilfe dieses Quellcodes ist es mir gelungen, meine Daten zu laden:
Delphi-Quellcode:
  type
  TInfo=class
  Name:String;
  Ort:String;
  ImageIndex:Integer;
  end;

var
  Form1: TForm1;
  Info: TInfo;
  Path:String;

implementation

{$R *.dfm}

 {Gibt den X-ten Teilstring eines mit Kommas getrennten Daten-Strings}
function ExtractSubStr(Str: String; Index: Integer): String;
var
  i: Integer;
begin
  Result := '';
  if Index < 1 then Exit;
  Str := Str + ',';
  for i := 1 to Index - 1 do Delete(Str, 1, Pos(',', Str));
  Result := Trim(Copy(Str, 1, Pos(',', Str) - 1));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Doublebuffered:=True;
Path:= ExtractFilepath(ParamStr(0));
Info := TInfo.Create;
ListBox1.Style := lbOwnerDrawFixed;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  th, tl: Integer;
  i: Integer;
  bmp: TBitmap;
  Info:TInfo;
begin
  with (Control as TListBox) do
  begin
    //Einstellungen für selektierten Item (A)
    if odSelected in State then
      Canvas.Brush.Color := $00EFD3C6; //Helles Blau für selektierte Items

    //Löscht den Item-Canvas
    Canvas.FillRect(Rect);

    //Einstellungen für selektierten Item (B)
    if odSelected in State then
    begin
      Canvas.Pen.Color := $00C66931; //Dunkleres Blau für Fokus-Rand
      Canvas.Brush.Style := bsClear;
      Canvas.Rectangle(Rect);
    end;
    Info:=TInfo(Items.Objects[Index]);
    //-Bild 48x48 px aus ImageList zeichnen----------------------------------

    bmp := TBitmap.Create;
    try
      i := Info.ImageIndex;
      if (i > -1) and (i <= Form1.ImageList1.Count - 1) then
      begin
        Form1.ImageList1.GetBitmap(i, bmp);
        Canvas.Draw(Rect.Left + 2, Rect.Top + 2, bmp);
      end;
    finally
      bmp.Free;
    end;

    //-Text-Zeile 1 ausgeben-------------------------------------------------

    //Seitenabstand für Text (rechts vom Bild)
    tl := ItemHeight + 4;
    //Oberkante für Textzeilen. Jeder neue Zeile addiert ihre Höhe dazu
    th := 2;

    Canvas.Font.Style := [fsBold]; //Font-Eigenschaften für aktuelle Zeile
    Canvas.Font.Color := $00C66931; //Blau und fett

    Canvas.TextOut(Rect.Left + tl, Rect.Top + th, Info.Name);
    th := Canvas.TextHeight(#32); //Unterkante alter Text = Oberkante neuer Text

    //-Text-Zeile 2 ausgeben-------------------------------------------------

    Canvas.Font.Style := Canvas.Font.Style - [fsBold]; //-
    Canvas.Font.Color := clWindowText; //Normal

    Canvas.TextOut(Rect.Left + tl, Rect.Top + th, Info.Ort);
    th := th + Canvas.TextHeight(#32); //s. o.

    //-Text-Zeile 3 ausgeben-------------------------------------------------

    Canvas.Font.Size := Canvas.Font.Size - 2; //-
    Canvas.Font.Color := clGray; //Grau und etwas kleiner

    //-------------------------------------------------------------------------

    //Überzeichnet alten Fokus
    if odFocused in State then
      Canvas.DrawFocusRect(Rect);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
begin
  with ListBox1 do //Objekte müssen separat freigegeben werden
    for i := 0 to Items.Count - 1 do
      TInfo(Items.Objects[i]).Free; //Freigeben
end;



procedure TForm1.Timer1Timer(Sender: TObject);
var hallo:TStrings;
begin
if FileExists(path+ Edit1.Text+'.txt') then
begin
hallo:=TStringlist.Create;
hallo.LoadFromFile(path+'Info'+Edit1.Text+'.txt');
Info.Name := hallo.Strings[0]+' '+hallo.Strings[1];
Info.Ort := hallo.Strings[3];
  ListBox1.Items.AddObject('', Info);
  ListBox1.Font.Name := 'Segoe UI';
  ListBox1.Font.Size := 10;

  ListBox1.ItemHeight := 2 + ImageList1.Height + 2;
  Edit1.Text:='';
  hallo.free;
end;
das einzige Problem ist, ich weiß nicht wie ich das Bild lade (es ist eine jpg datei) und wenn man jetzt öfter nacheinander sucht, dann werden auf einmal immer wieder neue Items für die Listbox created, man hat also nach dem zweiten suchen zwei mal die selbe Person angezeigt.
Mögliche Lösung:
Delphi-Quellcode:
if Listbox1.Items.Count>1 then
ListBox1.Items.Delete(1)
else
if FileExists(path+ Edit1.Text+'.txt') then
begin
....
Jetzt sieht es aber nicht nur verbugt aus, sondern es können nicht mal zwei leute in der liste angezeigt werden, da ja direkt der zweite wieder gelöscht wird
Hilfe bitte :?:

Popov 24. Okt 2012 23:38

AW: Idee für Auswahlfunktion
 
Du hast zum Teil den Code verstanden, ein Teil wohl nicht.

Zum Beispiel bringt es nichts die Zeile zu wiederholen. Sie gilt für alle Items gleich:
Delphi-Quellcode:
ListBox1.ItemHeight := 2 + ImageList1.Height + 2;
. Das Gleiche gilt für ListBox1.Font.Name und ListBox1.Font.Size. Es ist eine Einmalige Einstellung.

Die Funktion ExtractSubStr hebe ich nur gebraucht um Beispieldaten zu füllen. Wenn man es nicht braucht, dann weg damit.

Kein Fehler, aber bring etwas Struktur in deinen Code. Unübersichtlichkeit ist der erste Schritt zu Fehlern.
Delphi-Quellcode:
begin
if FileExists(path+ Edit1.Text+'.txt') then
begin
hallo:=TStringlist.Create;
Kein Fehler, aber schütze deine Objekte mit
Delphi-Quellcode:
try finally end;
Zuerst programmieren lernen und dann lernen es richtig zu machen (das hat mal einer so gepostet als ich ihm try finally vorschlug) ist nicht der richtige Weg.

Ohne
Delphi-Quellcode:
try finalle end;
erzeugt den Programm im Fehlerfall Speicherlecks. Und wie ich mir die Prozedur angucke, ist sie geradezu prädestiniert dazu Fehler zu produzieren. Da reicht nur eine Datei die deine StringList hallo nicht mit ausreichend Daten füllt und schon bricht die Prozedur zusammen. Mit einem Speicherleck. Hier zuerst schützen, dann entweder vorher abfragen ob hallo Count genug Items liefert, oder besser bei jedem Item explizit fragen. So kann man wenigstens auf die Zeilen zugreifen die die Textdatei liefert.

Zu deinem Problem mit Jpg, da gibt es zwei Möglichkeiten: die erste ist alle Daten auf der Festplatte vorher in Bmp und 48x48 zu konvertieren oder als Jpg zu laden, zu Bmp konvertieren und dann die Größe anpassen. Die Funktion die du suchst heißt JpgToBmp oder Jpg2Bmp oder statt Jpg auch JpegToBmp usw.

Am besten wäre es du postest eine Beispieldatei, dann weiß man was du laden willst.

DelphiUser1 28. Okt 2012 22:35

AW: Idee für Auswahlfunktion
 
Liste der Anhänge anzeigen (Anzahl: 1)
Beispieldatei


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 Uhr.

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