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
}