FYI, just an example to share I have been working on This week. I have been asking for help, so I thought I would share some code that is a little off the ("Larry") wall. -Eric
#-- Dual ListView Control Example Program #-- by Eric C. Hansen, [EMAIL PROTECTED] #-- Items stay sorted as the move between ListViews #-- Thanks to Glenn W. Munroe, [EMAIL PROTECTED] #-- For helping me get the sorting part added #-- POPULATES A LISTVIEW IN ONE SHOT, for speed! #-- This example also demonstrates an inline icon rainbow.ico use Win32::GUI; use Win32::GUI::BitmapInline (); use Win32::ODBC; #-- for getting data from an MS-Access DB $M = new Win32::GUI::Menu( "File" => "File", " > Exit" => "Exit"); $SFont = new Win32::GUI::Font( -name => "Courier New", -size => 8, -height => -11, -weight => 700); $D = new Win32::GUI::DialogBox ( -title => "Dual ListView Control Example", -menu => $M, -name => "Dialog", -left => 125, -top => 25, -width => 550, -height => 300); $ListView1 = $D->AddListView( -name => "ListView1", -font => $SFont, -left => 40, -top => 0, -height => 220, -width => 185, -sortascending => 1, -nocolumnheader => 1, -addstyle => WS_CHILD | WS_VISIBLE | 1, -fullrowselect => 0, -gridlines => 0, -checkboxes => 0, -singlesel => 1); $ListView2 = $D->AddListView( -name => "ListView2", -font => $SFont, -left => 320, -top => 0, -height => 220, -width => 185, -sortascending => 1, -nocolumnheader => 1, -addstyle => WS_CHILD | WS_VISIBLE | 1, -fullrowselect => 0, -gridlines => 0, -checkboxes => 0, -singlesel => 1); $AddAll = $D->AddButton(-name => "AddAll", -text => "Add All", -left => 237, -top => 54, -height => 25, -width => 73); $Add = $D->AddButton(-name => "Add", -text => "Add", -left => 237, -top => 83, -height => 25, -width => 73); $Remove = $D->AddButton(-name => "Remove", -text => "Remove", -left => 237, -top => 112, -height => 25, -width => 73); $RemoveAll = $D->AddButton(-name => "RemoveAll", -text => "Remove All", -left => 237, -top => 141, -height => 25, -width => 73); #-- "Rainbow photo" icon (rainbow.ico) inline #-- generated from BitmapInline at the command line: #-- perl -MWin32::GUI::BitmapInline -e inline('rainbow.ico') #-- NOTICE "newIcon" instead of "new" syntax $Icon = newIcon Win32::GUI::BitmapInline( q( AAABAAEAEBAAAAAAAABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQAMAAAAAAAAAAAAA AAAA AAAAAAAQGRoMFhcWICQYJCsYJisaJzAYKTYSJjQSISgcMTwWLjgZLzobLz0RKDIRKjMNKDIo LS8z NjUuMzIjLjQjLjYeKS02PUViZG9RV15ma3dtcXtiZ3NVWmNpZ3N8cnloZm1JSUtZV1hnZGRc WF1U WF5taW5+eX2NiYyTj5SHg4d6dnt4dXyjl57FrbTPtrrWyr9YWGBpZ295dn94dn9nbHSQjJOR jJSX lJyemqODgolGTlA8R0eDfH7Yur/az8bN5NBjZm9wcHiGhY+AhIxpb3iWlqGkoKirpa6tp6+5 srvC tr3Mtrjhwsbp1M/W7NS49+1gYWU3OTs4Ojs5Pj5XW151cnmqoqespam0rbC+s7fRt7rWt7np zMnj 6dG99umr//5dXWFdXF4lLCoOGRcbJyUvNjWSjY28tbWhmptwbW2vmZjkw8Dh38bB8t+p/f6R 5v1q a3KEgYlwbXQ8RUdDS0tgYmOBfH5hX182Pjw6Pz+umJbl2b/C6s6s/vqT5f58sv5rbHB7eoCV kpid l56qoaebkpU2PDojLisuNDNdWFrRw7DF48Gu+/KX6/59sv12lPJtbHGBfYKUj5SblpymnaKs oqWY jY2eiou/nqHIsqW907Gt9OWb7v9+t/53ku13hsdzbnSGgIeXkZefl5ynnqa0panIqKjDoKfJ rKTF 0Kuw7dic8P+Au/1zk+x6g8ODgqhzb3aIgIiZk5mhmJuqnqG+paTAnaPGpaPBv6Ct28Kc4viB uPd3 k+J2g759gJ2DfI10cHiIg4mXlJuimJuznJ26mqLDoKDLwKGx2LqY1+Z+ruhyjNF3gLN7eph7 doJ7 cntycXeKho6dl56pmZ+xkpu7mp/KuKG02bef6O2Du/ZyjdN0fq96eJR3cn56b3R6cXNwcHaI hYyl l5yvlZ20lZjAsqG10LSi4eSIyPh0mN9zgLt5eJl2cH90bHJ5bW56b29ubnOIgoahj5Wtj5a5 pZyz xKWj3s6P0vZ2pehwh8R0eqV3dYZxbXR1amt4a2pyaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ) ); #-- "Rainbow box" bitmap (rainbow.bmp) inline #-- generated from BitmapInline at the command line: #-- perl -MWin32::GUI::BitmapInline -e inline('rainbow.bmp') $Bitmap = new Win32::GUI::BitmapInline( q( Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAA AAAA AAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAAgQAAAIGAAACCAAAAgoAAA IMAA ACDgAABAAAAAQCAAAEBAAABAYAAAQIAAAECgAABAwAAAQOAAAGAAAABgIAAAYEAAAGBgAABg gAAA YKAAAGDAAABg4AAAgAAAAIAgAACAQAAAgGAAAICAAACAoAAAgMAAAIDgAACgAAAAoCAAAKBA AACg YAAAoIAAAKCgAACgwAAAoOAAAMAAAADAIAAAwEAAAMBgAADAgAAAwKAAAMDAAADA4AAA4AAA AOAg AADgQAAA4GAAAOCAAADgoAAA4MAAAODgAEAAAABAACAAQABAAEAAYABAAIAAQACgAEAAwABA AOAA QCAAAEAgIABAIEAAQCBgAEAggABAIKAAQCDAAEAg4ABAQAAAQEAgAEBAQABAQGAAQECAAEBA oABA QMAAQEDgAEBgAABAYCAAQGBAAEBgYABAYIAAQGCgAEBgwABAYOAAQIAAAECAIABAgEAAQIBg AECA gABAgKAAQIDAAECA4ABAoAAAQKAgAECgQABAoGAAQKCAAECgoABAoMAAQKDgAEDAAABAwCAA QMBA AEDAYABAwIAAQMCgAEDAwABAwOAAQOAAAEDgIABA4EAAQOBgAEDggABA4KAAQODAAEDg4ACA AAAA gAAgAIAAQACAAGAAgACAAIAAoACAAMAAgADgAIAgAACAICAAgCBAAIAgYACAIIAAgCCgAIAg wACA IOAAgEAAAIBAIACAQEAAgEBgAIBAgACAQKAAgEDAAIBA4ACAYAAAgGAgAIBgQACAYGAAgGCA AIBg oACAYMAAgGDgAICAAACAgCAAgIBAAICAYACAgIAAgICgAICAwACAgOAAgKAAAICgIACAoEAA gKBg AICggACAoKAAgKDAAICg4ACAwAAAgMAgAIDAQACAwGAAgMCAAIDAoACAwMAAgMDgAIDgAACA 4CAA gOBAAIDgYACA4IAAgOCgAIDgwACA4OAAwAAAAMAAIADAAEAAwABgAMAAgADAAKAAwADAAMAA 4ADA IAAAwCAgAMAgQADAIGAAwCCAAMAgoADAIMAAwCDgAMBAAADAQCAAwEBAAMBAYADAQIAAwECg AMBA wADAQOAAwGAAAMBgIADAYEAAwGBgAMBggADAYKAAwGDAAMBg4ADAgAAAwIAgAMCAQADAgGAA wICA AMCAoADAgMAAwIDgAMCgAADAoCAAwKBAAMCgYADAoIAAwKCgAMCgwADAoOAAwMAAAMDAIADA wEAA wMBgAMDAgADAwKAA8Pv/AKSgoACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////APn5 +Wdn Z/v7+vr6+sLCwv75+WdnZ/v7+/r6+vrCwsL++flnZ2f7+//6+vrCwsL+/vlnZ2f7+/v6+vrC wsL+ /v75Z2dn+/v/+vr6wsLC/v7+Z2dn+/v7//r6wsLCwv7+/mdnZ/v7//r6wsLCwv7+/v5nZ/v7 +//6 +sLCwsL+/v7+Z2f7+/v6+sLCwsLC/v79/Wf7+/v/+vrCwsLC/v7+/f1n+/v7+vr6wsLC/v7+ /f39 +/v7+/r6wsLCwv7+/v39/fv7+/r6wsLCwv7+/v39/f37+/r6+sLCwv7+/v79/f39//v/+vrC wsL8 /v79/f39/f/7+vr6wsLC//7+/f39/f0= ) ); $IL = new Win32::GUI::ImageList(16, 16, 0, 1, 0); $IL->Add($Bitmap, 0); ##################### #-- INITIALIZATION ##################### $ListView1->SetImageList($IL,1); #-- rainbow box $ListView2->SetImageList($IL,1); #-- rainbow box #-- We have -nocolumnheaders => 1 set so #-- we won't be showing these headers, #-- however, setting them is necessary. $ListView1->InsertColumn(-index => 0, -width => 185, -text => "Names Available"); $ListView2->InsertColumn(-index => 0, -width => 185, -text => "Name Selected"); $sel1 = -1; #-- global, ListView1 undefined selection $sel2 = -1; #-- global, ListView2 undefined selection Database_Connect(); Load_ListView1(); $db->Close(); undef $db; $ListView1->Select(0); $ListView1->SetFocus(); $D->SetIcon($Icon); #-- custom icon to replace camel $D->Show(); $D->BringWindowToTop(); Win32::GUI::Dialog(); #-- event handler initiated ###################### sub Database_Connect { ###################### #-- File DSN "MyDB.dsn" contains the following lines: #-- [ODBC] #-- DRIVER=Microsoft Access Driver (*.mdb) #-- UID=admin #-- UserCommitSync=Yes #-- Threads=3 #-- SafeTransactions=0 #-- PageTimeout=5 #-- MaxScanRows=8 #-- MaxBufferSize=512 #-- FIL=MS Access #-- DriverId=281 #-- DefaultDir='C:\MyAppDir' #-- DBQ='C:\MyAddDir\MyDB.mdb' my $FILEDSN="FILEDSN=C:\\Bibles\\DoveBible.dsn"; $db = new Win32::ODBC($FILEDSN); if (! $db) { my $error = Win32::ODBC::Error(); Win32::GUI::MessageBox($D, "Can't Establish DB Connection using:\n$FILEDSN\n$error", "Dual ListView Control Example - Error",16,); Win32::GUI::MessageBox($D, "Shutting Down The Application", "Dual ListView Control Example - Status",64,); exit; } } #################### sub Load_ListView1 { #################### my $sqltxt = "SELECT name FROM BibleBook"; my $ret = $db->Sql($sqltxt); if ($ret) { my $error = $db->Error(); # database error msg $db->Close(); undef $db; Win32::GUI::MessageBox($D,$error, "Dual ListView Control Example - SQL Error($ret)",16,); Win32::GUI::MessageBox($D,$sqltxt, "Dual ListView Control Example - SQL Cmd",16,); Win32::GUI::MessageBox($D, "Shutting Down The Application", "Dual ListView Control Example - Status",64,); exit; } @List_Info = (); #-- global variable my $cnt = 0; #-- read through ODBC connection object, Sql result set... while ($db->FetchRow()) { my $name = $db->Data("name"); my %hash = (-text => $name, -image => 0,); my $hashref = \%hash; $List_Info[$cnt] = $hashref; $cnt++; } $ListView1->Add(@List_Info); #-- populate ListView1 in 1 shot } #################### sub Add_Click { #################### if ($sel1 < 0) { return; } my %data = $ListView1->ItemInfo($sel1); my $name = $data{-text}; my %hash = (-text => $name, -image => 0, -selected => 1,); #-- -selected => 1 causes firing of ListView2_ItemClick my $hashref = \%hash; $ListView2->Add($hashref); #-- fires ListView2_ItemClick if ($ListView1->Count() == 1) { $sel1 = -1; $ListView1->Clear(); $ListView2->SetFocus(); } else { $ListView1->DeleteItem($sel1); my $sel = $ListView1->GetFirstVisible(); $ListView1->Select($sel); } } #################### sub Remove_Click { #################### if ($sel2 < 0) { return; } my %data = $ListView2->ItemInfo($sel2); my $name = $data{-text}; my %hash = (-text => $name, -image => 0, -selected => 1,); #-- "-selected => 1" causes firing of ListView1_ItemClick my $hashref = \%hash; $ListView1->Add($hashref); #-- fires ListView1_ItemClick if ($ListView2->Count() == 1) { $sel2 = -1; $ListView2->Clear(); $ListView1->SetFocus(); } else { $ListView2->DeleteItem($sel2); my $sel = $ListView2->GetFirstVisible(); $ListView2->Select($sel); } } ################## sub AddAll_Click { ################## $ListView1->Clear(); $sel1 = -1; $ListView2->Clear(); $ListView2->Add(@List_Info); #-- populate ListView2 in 1 shot #-- Select automatically fires the ListView2_ItemClick event $ListView2->Select(0); $ListView2->SetFocus(); }; ##################### sub RemoveAll_Click { ##################### $ListView1->Clear(); $ListView2->Clear(); $sel2 = -1; $ListView1->Add(@List_Info); #-- populate ListView1 in 1 shot #-- Select automatically fires the ListView1_ItemClick event $ListView1->Select(0); $ListView1->SetFocus(); }; ######################### sub ListView1_ItemClick { ######################### $sel1 = shift; #-- global, index of selected item $ListView1->EnsureVisible($sel1); } ######################### sub ListView2_ItemClick { ######################### $sel2 = shift; #-- global, index of selected item $ListView2->EnsureVisible($sel2); } ################## sub Exit_Click { ################## if ($db) { $db->Close(); undef $db; } return -1; #-- stops event handler } ###################### sub Dialog_Terminate { ###################### if ($db) { $db->Close(); undef $db; } return -1; #-- stops event handler }