Avatar billede ducks Nybegynder
10. november 2004 - 00:01 Der er 22 kommentarer og
1 løsning

Sortere en List slavisk efter en anden

Er det muligt at tilføje noget kode for List1 sådan, at hvis jeg har
List1:
Brød
Saltsyre
Mælk

Og

List2:
Madvare
Gift
Drikkevare

At hvis jeg så sorterer List1 alfabetisk, så vil List2 sortere sig så deres index passer sammen logisk?

Altså, hvis jeg vælger at sortere List1 alfabetisk, kommer de til at se sådan ud:

List1:
Brød
Mælk
Saltsyre

Og

List2:
Madvare
Drikkevare
Gift

Håber det er til at forstå
Avatar billede joern Nybegynder
10. november 2004 - 08:52 #1
Hej.

Det er kun muligt, hvis der er en tabel - et array el. lign. Hvor sammenhængen mellem begreberne er fastlagt.

M.v.h.  Jørn
Avatar billede sjh Nybegynder
10. november 2004 - 11:29 #2
'---------------------- Form1 ----------------------
Option Explicit

Private Sub Form_Load()
  AddText "Saltsyre", "Gift"
  AddText "Mælk", "Drikkevare"
  AddText "Brød", "Madvare"
End Sub

Public Sub AddText(strText1 As String, strText2 As String)
Dim intIndex As Integer
  With List1 '<- ListBox (Sorted = True)
      .AddItem strText1
      intIndex = .NewIndex
  End With
  With List2 '<- ListBox (Sorted = False)
      .AddItem strText2, intIndex
  End With
End Sub
'---------------------- Form1 ----------------------
Avatar billede ducks Nybegynder
10. november 2004 - 15:30 #3
joern: Kan du give et eksempel på, hvordan det vil se ud, hvis det er lavet med arrays. Så kan jeg vel bare slette list1 når jeg sorterer og lægge værdierne fra det array med navnene ind igen når det er sorteret?
Avatar billede joern Nybegynder
10. november 2004 - 16:22 #4
Hej.

Hvor kommer data fra?  Opbevares de i en fil (ascii) eller i en database, eller indtastes de af brugeren?
Du er nødt til at fremstille spørgsmålet mere klart, før jeg kan foreslå et svar.

Programmet skal have at sted at 'slå op', når du indtaster "Ole" at kunne se at det er et drengenavn og ikke et pigenavn, - ikke sandt.  Sådan en tabel har du i hjernen når det gælder danske navne.

M.v.h.  Jørn
Avatar billede ducks Nybegynder
10. november 2004 - 17:30 #5
Brugeren indtaster i en inputbox, men kan også gemme listen i en txt fil som skal kunne åbnes igen. Ren tekst det hele.

Det skal være sådan at brugeren indtaster et eller andet navn, og et ID hvor den gemmer navnet i den ene liste/array og id'et i den anden, og når navnet skifter placering, skal ID'et skifte placering, så de hele tiden er sammenkædet.
Avatar billede joern Nybegynder
10. november 2004 - 17:58 #6
Hej.

Det er stadig uklart.  Der må nødvendigvis eksistere en fil på forhånd, hvor alle tænkelige madvarer, giftstoffer og drikkevarer er registreret, sammen oplysning om hvilken kategori de tilhører.
Hvor skal den forbindelse ellers komme fra?

Anvendelsen af array kan jeg godt beskrive, men det løser jo ikke dit spørgsmåls grundlæggende problem.

M.v.h.  Jørn
Avatar billede ducks Nybegynder
10. november 2004 - 20:52 #7
Oplysninger gemmer jeg i en txt fil, jeg ved ik hvordan det er smartes at gemme oplysninger, men jeg kunne forestille mig, at det var smart med fx:
ID|navn
Altså
1|Brød
2|Mælk
3|Computer
Osv.

Den måde der så bliver tilføjet nyt på er, at brugeren trykker "tilføj", skriver først i et input felt, hvad ID er og bagefter - i en anden input - hvad navnet er.

Bagefter skal man have muligheder for at sortere, så navnene ligger alfabetisk, uden ID'erne bliver blandet med andre navne, hvis du forstår?
Avatar billede joern Nybegynder
10. november 2004 - 21:34 #8
Hej.

Når du gemmer data med flere felter pr. post i en ascii-fil, skal programmet på en eller anden måde kunne afgøre, hvor et felt slutter og næste felt begynder.
Enten skal du have én linie pr. post med fast længde på felterne:

Ole Olsen                Søndergade 22            4780 Stege
Katrine Haslund Sørensen Prags Boulevard 21, 1. Tv 2200 København N

Eller også skal du have et felt pr. linie (altså adskilt af vbcrlf) og så et fast antal linier pr. post:

Ole Olsen
Søndergade 22
4780
Stege
Katrine Haslund Sørensen
Prags Boulevard 21, 1. Tv
2200
København N

At anvende skilletegn i form af semikolon eller andet er også muligt, men ret besværligt.

Men du forholder dig ikke til min gentagne indvending, at programmet skal have en opslagstabel for sammenhæng mellem input og kategori.

Jeg kan ikke komme med kode-forslag før du har forstået dette punkt.

M.v.h.  Jørn
Avatar billede ducks Nybegynder
10. november 2004 - 22:22 #9
"Men du forholder dig ikke til min gentagne indvending, at programmet skal have en opslagstabel for sammenhæng mellem input og kategori."
  Så har jeg muligvis misforstået dig der, hvis det svar du søger ikke er, at der eet navn med eet id og de skal, ligegyldige hvordan det hele rodes rundt, stadig sammenkædes, ID'et nødvendigvis ikke kun bestående af tal.

"At anvende skilletegn i form af semikolon eller andet er også muligt, men ret besværligt."
Så ville en løsning med ini filer altså være bedst?
Avatar billede joern Nybegynder
10. november 2004 - 22:47 #10
Hej.

Jeg har forstået ideen med programmet sådan, at når en bruger indtaster 'rødbede', så får han at vide, at det er en madvare.  Hvis han indtaster pudsekræm, skal han have at vide at det er giftigt.  Eller er det bare et eksempel?
En skam at ikke andre er på banen, jeg er nok for dum til at forstå, hvad det er du mener og hvad du vil opnå med dine to synkrone lister.

Godnat  m.v.h.  Jørn
Avatar billede ducks Nybegynder
10. november 2004 - 23:16 #11
Sorry, det er min fejl, det var bare et eksempel det første :(

Som sagt, brugeren indtaster oplysninger:

strID = InputBox("Indtast ID")
strNavn = InputBox("Indtast navn")

(Og her så sådan som den fungerer nu)

ListID.AddItem strID
ListNavn.AddItem strNavn

Hvis man sorterer ListNavn alfabetisk, skal det stadig passe, med at ListID har samme Index i forhold til ListNavn

Håber det er til at forstå nu
Avatar billede martin_moth Mester
11. november 2004 - 16:20 #12
Vis lige koden hvor du sorterer alfabetisk i list1
Avatar billede ducks Nybegynder
11. november 2004 - 16:40 #13
Sætter Sorted til True i Properties menuen
Avatar billede martin_moth Mester
11. november 2004 - 17:33 #14
Men det er jo i designtime - ikke i runtime.
Avatar billede martin_moth Mester
11. november 2004 - 17:53 #15
Jeg forstår det således:

Du har en list1, der har sorted=true.

Du indtaster samhørende data i List1 og List2 i runtime, og det går der ged i, da list1 har sorted=true.

Jeg villg gøre følgende:

Oprette en type:

Type tpListItem
  List1item as string
  List2item as string
End Type






Når en bruger taster data ind i dit program, gemmer du de to indtastninger på samme plads i et array

Dim MitArray() as tpListitem
... bla bla
MitArray(i).List1item = strID
MitArray(i).List2item = strNavn




Så har du ALTID samhørende værdier mellem de parvis indtastede strID og strNavn.
Så kan gøre følgende to ting:

ENTEN:
Ved hver indtastning ryddes List1 og List2, du sorterer arrayet efter .List1item, og fylder derefter List1 og List2 med det sorterede array. List1 og List2 skal begge have .sorted=false

ELLER

Du bruger List1.additem til at smide MitArray(i).List1tem i listen
Du rydder List2, og laver en løkke, hvor du for hver post i List1 finder den tilsvarende værdi i arrayet, og når den er fundet, indlæser du MitArray(i).List2tem i List2.


egge er forholdsvis lette at leve.

Erklær arrayet som dynamsik, og HUSK at prube redim PRESERVE når du forøger størrelsen med 1
Avatar billede martin_moth Mester
11. november 2004 - 17:54 #16
villg = ville
egge = begge
prube = bruge
Avatar billede joern Nybegynder
11. november 2004 - 17:56 #17
Hej ducks.

Kender du til og har du overvejet MSFlexGrid i stedet for 2 lister?

M.v.h.  Jørn
Avatar billede martin_moth Mester
11. november 2004 - 17:57 #18
Nå ja - måske det var sådan cirka 1000 gange lettere :o)
Avatar billede ducks Nybegynder
11. november 2004 - 18:34 #19
Problemet er at man ikke skal kunne se ID'et :(

Men jeg har, en lidt billig, løsning. At jeg smider navnet ind i begge Listboxe, men den med ID'et bliver efterfulgt af |ID altså navn|ID, for så sorterer de vidst ens. Når jeg så skal bruge ID'et, bruger jeg Right(lstID.List(lstNavn's Index), InStr(lstID.List(lstNavn's Index), "|"))
Avatar billede sjh Nybegynder
11. november 2004 - 19:11 #20
hvad type er ID?? du skriver godt nok strID men er det en string??
Avatar billede sjh Nybegynder
11. november 2004 - 19:17 #21
hvis ID er ID fra en access database så kan du gøre sådan.

Option Explicit

Private Sub Form_Load()
Dim i As Integer
  For i = 1 To 10
    With List1 '<- ListBox (Sorted = True)
        .AddItem "Tekst " & i '<- Tekst
        .ItemData(.NewIndex) = i '<- ID (long)
    End With
  Next
End Sub

Private Sub List1_Click()
Dim intID As Integer
  With List1 '<- ListBox (Sorted = True)
      intID = .ItemData(.ListIndex)
  End With
  MsgBox intID
End Sub
Avatar billede joern Nybegynder
11. november 2004 - 19:29 #22
Hej Ducks.

Du er ikke den der svarer på spørgsmål!  Kender du MSFlexGrid?  Du kan lave en kolonne med bredde 0, så kan man ikke se hvad der står.

Men jeg står i øvrigt af tråden.

M.v.h.  Jørn
Avatar billede ducks Nybegynder
11. november 2004 - 20:50 #23
Nej, jeg kender åbenbart ikke så meget til FlexGrid
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester