Gå til innhold

Hvordan søke i ett listbox component?


Anbefalte innlegg

Lurer på hvordan jeg får til å søke i ett listbox komponent, slik at man feks trykker ctrl+f og da får man opp ett vindu hvor man skriver inn ett navn og hvis listbox componentet inneholder det så blir det markert, vet at jeg må bruke den slke dialogen men har ikke peil på hva jeg skal skrive på noen av componentene. Og det ville vært konge hvis noen viste av noe alla den Winamp har slik at de blir filtrert isteden for at man trykker søk også kommer det opp noen.

 

Takk for alle svar.

Lenke til kommentar
Videoannonse
Annonse

Har noen spørsmål til som jeg kom på:

 

Jeg har to Edit bokser, og skriften i de vil jeg ha i en edit boks. Så jeg brukte denne koden:

Edit1.text := Eedit2.text + edit3.text;

Og dette funker utmerket, bare at det eneste som kommer er det som står i de to edit boksene ved oppstart av programmet. Så jeg lurte hvor jeg måtte legge den koden dær slik at de kom automatisk hver gang det ble skrevet noe i de.

 

Og mitt andre spørsmål er om det er mulig å få den teksten i Edit1 til å rulle bortover automatisk, og isåfall hvordan?

 

Takk

Lenke til kommentar

1. Søk / filter i listbox

Vil anta at winamp søker eller filtererer i en underliggende datastruktur og deretter tegner gui'et på nytt.

2. Fange opp endringer i editboks

Bruk 'OnChange'-eventet dersom det skal skje 'realtime'. OnExit dersom ting skal oppdateres først når man er ferdig og endre. (Krever at man forlater feltet for å få se oppdateringen)

3. Scroll i editboks

Her kreves det en annen komponent. TEdit har ingen slik funksjonalitet og støtter heller ikke custom draw sånn helt uten videre.

 

-Vegar

Lenke til kommentar

Oki.. Takk, skal prøve å se om jeg forsto den edit greian. Men skjønte ikke den søkinga til Lisboxen helt? Kan ikke så mye om delphi osv enda, har du noen eksempel/kodesnutter. Og vet du av noen komponenter som er det samme som Tedit bare at de scroller?

 

Takk

 

Edit: Eller er det mulig med scroll på en Label elr en annen tekst dings? Takk

 

Edit2: Lurte også på om det var en script som gikk ann å bruke som gjorde at når Tmediaplayer var ferdig med en sang så gikk Tlistbox ett hakk ned og Tmediaplayer begynner automatisk å spille igjen? Takk

 

 

Edit3: Gullfisk minne her så jeg kom ikke på alle spørsmålene først:P men her er hvertfall enda ett: Holder på med en slags consol ting. Her er litt koden jeg bruker:

if Form3.Edit1.Text = 'exit' then close;
if Form3.Edit1.Text = 'open' then btnOpenFolder.Click;
if Form3.Edit1.Text = 'play' then mp3player.Play;
if Form3.Edit1.Text = 'stop' then mp3player.Stop;

Så det jeg lurte på var om det fantes en kommando som jeg kunne sette helt på slutten av det dær med noe som skal skje hvis noe annet det det som står dær blir skrevet inne... Alltså noe slikt:

 

if Form3.Edit1.Text = 'exit' then close;
if Form3.Edit1.Text = 'open' then btnOpenFolder.Click;
if Form3.Edit1.Text = 'play' then mp3player.Play;
if Form3.Edit1.Text = 'stop' then mp3player.Stop;
If not elr else then Memo1.Lines.add('Kommandoen eksisterer ikke');


 

Håper noen vet hvordan dette også gjøres:P Takk

Endret av oblomsoe
Lenke til kommentar

Jeg skjønner ikke helt hva du mener med scrolling, er det vertikal eller horisontal scrolling? En editboks scroller jo horisontalt hvis du skriver inn mer tekst der enn bredden av boksen tillater å vise. Hvis det er vertikalt, er kanskje en TMemo det du er på jakt etter ?

 

Ellers har både listbokser og kombobokser en egenskap som heter Autocomplete. Er det den du mener å bruke som en erstatning for Ctrl F?

 

Ang. å spille av en rekke med melodier fra en listboks, så kan du i prinsippet bruke en for-løkke:

for I:= 0 to Listbox1.Items.Count-1 do
   SpillMelodi (Listbox1.Items [I]);

 

Den kodesnutten du viste med tillatte kommandoer bør bruke ELSE, noe sånt:

if Form3.Edit1.Text = 'Close' then Exit
 else
 if ....
 else
 if ...
 else
 Memo1.Lines.Add ('Kommandoen finnes ikke');

Lenke til kommentar

Takk, skal prøve dette. Men det jeg mente isteden for scrolling var rullende tekst, slik at teksten ruller fra begynnelse til slutt.

 

Edit: Skjønte ikke det med Autocomplete helt. For finner jeg det, og får jeg da en sånn søke funksjon?

 

Edit2: For også noen feilmld på den koden jeg fikk, hvor skal jeg legge den?

Endret av oblomsoe
Lenke til kommentar

OK, du vil ha en "evigvarende" scrolling? Da bør du satse på å laste ned en scrolling label for eksempel. Prøv å Google etter en slik komponent, eller download Jedi's jvcl komponentpakke. Der finner du scrolling labels og litt av hvert annet. Jeg tror du finner en link til en download av JEDI på http://homepages.borland.com/jedi/jcl/.

 

Autocomplete virker som du har beskrevet om søking ovenfor, altså stave de(n) første bokstaven(e) i et ord, så hopper autocomplete til første forekomst (linje) der bokstavene foreslår ordet er oppført om dette finnes i listboksen/komboboksen. Sjekk hjelp (F1) om TListbox Autocomplete, så ser du mer i detalj om dette er noe for deg, eller prøv en kodesnutt, så ser du hvordan det virker.

Lenke til kommentar

Er ikke helt sikker på om jeg forstod det med scrollingen jeg heller, men denne sørger for at edit1 viser det siste som ble skrevet:

 

procedure TForm1.Edit2Change(Sender: TObject);
begin
 edit1.text := edit2.text + edit3.text;
 edit1.SelStart := length(edit1.text);
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
 edit1.text := edit2.text + edit3.text;
 edit1.SelStart := length(edit1.text);
end;

 

For winamp lookalike søking:

 

dropp en Edit og en Listbox, lag en tekst fil med noen linjer med tekst i, eller generer en stringlist med data i.

 

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   ListBox1: TListBox;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormShow(Sender: TObject);
   procedure Edit1Change(Sender: TObject);
 private
   S: TStringList;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);

var
 x: integer;

begin
 listbox1.Items.Clear;
 for x := 0 to S.Count-1 do
   begin
     if length(edit1.text) > 0 then
     begin
       if AnsiContainsText(s[x],edit1.text) then
        listbox1.Items.Add(s[x]);
     end
     else
       listbox1.Items.Add(s[x]);
   end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 s := TStringList.Create;
 s.LoadFromFile('test.txt');
 listbox1.Items := s;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 s.free;
end;

end.

 

EDIT: Dette vil gå tregt hvis det er mange linjer det er snakk om, for å få fortgang på det så vill jeg tro at SQL og ListView med OwnerData vil få fart på sakene. Vet ikke hvordan winamp gjengen har gjort det, men de har nok en del mere peiling en hva jeg har.

Endret av gerri28
Lenke til kommentar
  • 8 måneder senere...

for å lage en scroll så kan du bruke denne koden.

 

function scroll(txt:string):string;
begin
result := Copy(txt, 2, length(txt)-1) + Copy(txt,1,1);
end;

 

for å scrolle mot høyre kan du sette inn denne isteden;

...
result := Copy(txt,length(txt)-1,1) + Copy(txt, 1, length(txt)-1);
...

 

legg den inn i en Timer, så burde det funke.

Edit1.text := scroll(edit1.text);

Endret av hjahre
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...