18. januar 2001 - 16:25Der er
27 kommentarer og 2 løsninger
Søgning der skal vises i DBGrid
Jeg har lavet en paradox-tabel, blandt andet med et kategori-felt. Nu skal jeg bruge en combobox eller lignende, hvor folk kan vælge en kategori. Så skal DBGrid\'en vise en liste over alt hvad der er i den kategori. Bagefter skal man kunne nulstille, så hele tabellen igen vises i DBGrid\'en.
Umiddelbart er det så simpelt, at det ikke er med i nogen af mine bøger, eller kan findes på nettet... (Og eksperten.dk\'s søgefunktion er forkølet, så der er ingen hjælp at hente denne gang.)
ibtage - Tak, det kan være jeg vender tilbage vedr. komponenten. Men jeg må lige prøve om jeg kan klare det uden...
tknudsen - Også tak til dig. Umiddelbart virkede det du skrev, ligetil. Meeeen det driller lidt, så jeg håber, at du vil bruge tid på at uddybe lidt? Jeg har i forvejen en table, der peger på grid\'en, så alt indholdet i tabellen vises i grid\'en. Det er bare den jeg skal rette i, ikke? Når jeg sætter filter på, må det næsten blive ved at brugeren klikker på en knap, for der skal jo ikke være filter på hele tiden... Derfor går jeg ud fra at det du skriver, skal skrives i koden bag en onClick. Meeen det virker ikke. Hvis man for eksempel vælger kategorien telefoner og så klikker på Søg-knappen, får man at vide at der ikke er nogen fields der hedder telefoner. Der er flere poster i tabellen der hedder telefoner (under kategori), men jeg er ikke sikker på, at den søger i det felt der hedder kategori?
Jeg kiggede lige i hjælp, og der fandt jeg blandt andet følgende sætning efter en forklaring om hvordan filter virker: \"Field comparisons are not supported against local tables (Paradox, dBASE, Access, FoxPro).\" Er det der mit problem ligger? Eller er jeg bare ikke særlig god til at fortælle den at den skal søge i det bestemte felt? Hjææææææælp!!
Hvis du vil søge efter telefoner i feltet \'kategori\' skal du i filter strengen skrive:
\'kategori = telefoner\';
eks:
(t1 er en TTable, cb1 er en TComboBox og dbg1 er et TDBGrid) // filtrerer data ud fra kategori feltet procedure TMainForm.c1Change(Sender: TObject); begin t1.Filter := \'kategori = \'+c1.Text; t1.Filtered := true; end;
der er sføli mange måder at fjerne filteret på - evt kan du tilføje en tekst i din combobox og så i onChange eventen spørge på c1.text:
procedure TMainForm.c1Change(Sender: TObject); begin if c1.Text <> \'Fjern filter\' then begin t1.Filter := \'kategori = \'+c1.Text; t1.Filtered := true; end else t1.Filterede := false; end;
tknudsen - Det hjalp på forståelsen med din 2. forklaring. Jeg forstod princippet i forvejen, men var ikke helt klar over hvad der skulle skrives i kode, og hvad der skulle rettes til i Object Inspectoren... Det hjalp, tak! Meeeen den brokker sig stadig...! Den bliver ved med at fortælle mig at \"Field \'Telefoner\' not found\". Jeg synes ellers at jeg har forklaret den at den skal lede efter poster i kolonnen \'Kategori\', men den er måske lidt langsom i opfattelsen...? ;o)
Kan oversættes til: Sæt et filer således at der kun vises records hvor indholdet af kolonnen med navnet kategori skal være lig med en kolonne, hvis navn kan findes i c1.text.
Hvis der så står \'telefoner\' i c1.text, så giver det problemer, idet der ikke er en kolonne med navnet telefoner. Det du vil ha\' er egentligt et filter der siger:
Sæt et filer således at der kun vises records hvor indholdet af kolonnen med navnet kategori skal være lig med DEN TEKST STRENG, hvis INDHOLD kan findes i c1.text.
Dette gøres med: t1.Filter := \'kategori = \"\'+c1.Text+\'\"\';
(Du skal muligvis bruge \'-tegn i stedet for \"-tegn...prøv selv.)
Hvis det virker, så giv mig 1 point og resten til tknudsen - det er hans ide.
delphi - VarelagerTable.Filter := \'Kategori = \'\'+SoegCBox.Text+\'; giver fejlen: \"Unterminated string constant\" når jeg afprøver søgedelen af programmet.
VarelagerTable.Filter := \'Kategori = \'\"+SoegCBox.Text+\"; giver fejlen: \"Illegal character in input file\" når jeg kompilerer.
Et ekstra \' til sidst, ligesom du har skrevet, altså: VarelagerTable.Filter := \'Kategori = \'\'+SoegCBox.Text+\'\'; giver fejlen: \"Unterminated string\" når jeg kompilerer.
En anden ting jeg ikke forstår: Hvordan fortæller det ekstra + tilsidst, at det handler om tekststrengens indhold?
(Cut\'n\'paste det over i Delphi, så er det nemmere at se...)
Det jeg gør er at samle tre strenge til en: Første streng: \'kategori = \"\' Anden streng : c1.Text Tredie streng: \'\"\'
Første streng består først af navnet på en kolonne. Ordet kategori står ikke i \"-tegn (populært kaldet dylpher (ph læses som f) her på egnen). Dette betyder at database enginen læser ordet som et kolonne navn. Anden del af strengen er et lighedtegn. Tredie del er et \"-tegn, altså en dylph. Anden streng er indholdet af en textbox, combobox eller hvad ved jeg. Antag at der står ordet telefoner i denne component. Tredie streng er blot en afsluttende dylph.
Resultatet af denne sammenlægning er altså: (Forudsat altså der står telefoner i c1)
t1.Filter := \'kategori = \"telefoner\"\'
Prøv evt. at cutte den linie ind i din kode istedet for.
Eksperten har altså et gevaltigt hadikap, når det drejer sig om at skrive \'-tegn og \"-tegn!! Fx. kan man ikke skrive to efterfølgende \'-tegn, idet Eksperten sletter det ene af dem. Se selv: nu skriver jeg to \'-tegn (apostroffer): \'\'
Ser du teksten \", så kan du altså gå ud fra at der ikke er tale om to apostroffer, men om en dylph (også kaldet gåseøjne af åndeligt mindrebemidlede og andre alternativt begavede personligheder).
Så er jeg tilbage fra weekenden. Tre dags weekender er fede...
>...for man kan heller ikke se om der er lavet 1 \" eller to \'...
Jo, prøv at markere texten med musen. Der kan du se om du kan markere et \"-tegn eller to \'-tegn.
>...ikke løses hvis man skriver mellemrum mellem apostrof som her \' \'
Nix.
Hvis du laver følgende:
ShowMessage(\'Det er hans hund\');
Vil du se texten: Det er hans hund
Hvis du istedet ønsker texten: Det er Hans\' hund
og derfor skriver:
ShowMessage(\'Det er Hans\' hund\');
så vil Delphi Compileren brokke sig (noget med ikka afslørede strenge eller måske noget med en identifier expected.. prøv selv).
Problemet er at Delphi i det sidste eksempel ser: Det er Hans som en selvstændig og afsluttet streng. Derefter kommer ordet hund, idet mellemrummet ses som et whitespace og derfor droppes. Ordet hund læses som navnet på en kommando (identifier eller procedurenavn) - og da denne ikke er oprettet er der tale om en fejl.
I Dlphi bliver strenge altså omsluttet af \'-chars. Hvad nu hvis man vil skrive en \'-char som en del af sin streng? - så skriver man bare to! Delphi skriver to \'-chars i streng som et enkelt. I sidste eksempel bliver kommandoen altså:
ShowMessage(\'Det er Hans\'\' hund\');
(Der er altså to \'-tegn efter Hans - men om Experten vil skrive det rigtigt er en anden sag!)
Outputtet bliver nu: Det er Hans\' hund.
En streng der kun indeholder et \'-tegn bliver således: \'\'\'\' (fire \'-tegn på stribe) Fx: Label1.Caption := \'\'\'\'; // (fire \'-tegn på stribe)
En tom streng er iøvrigt to \'-tegn efter hinanden: Label1.Caption := \'\';
Delphi - JUBLE!! Det virker! Forskellen er, at første gang du skrev, skrev du: t1.Filter := \'kategori = \"\'+c1.Text+\'\"\'; og anden gang skrev du: t1.Filter := \'kategori = \'\'\'+c1.Text+\'\'\'\';
(Man kan se forskellen når det bliver copy/pastet til Delphi...)
Det var da skægt... Prøvede at give tknudsen 20 point og delphi 30 point, men det endte med at blive 25 til tknudsen og 5 til delphi... Kan man ikke uddele flere point end man havde sat på spørgsmålet til at starte med...? Man har jo tit lyst til at belønne flere der har hjulpet. (Og hvad kan de bruge det til hvis de hver får 10 skaldede point...)
Nå, hvis du vil have flere point, Delphi, så må du endelig sige til. Jeg deler gerne ud som tak for den gode hjælp! (Men gider ikke oprette spørgsmål for at give dig point hvis du er ligeglad...)
Rie.... hmm... Jeg kendte engang en pige der hed Rie i Sønderborg. Hun var nu mere til programmøre end programering..... Det er forresten noget i retning af 10 år siden!
På den anden side får jeg intet lavet, hvis jeg først giver mig i kast med hygge-emails... Jeg skal sådan set forestille at være på arbejde! :o)
Men vi kan fortsætte en anden gang. Mit næste spørgsmål er alligevel lige på trapperne... (som altid... ;o)
Så vi snakkes.
Rie.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.