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
}
 



Reply via email to