Solved

A listbox component containing nothing but images

Posted on 2006-05-09
27
554 Views
Last Modified: 2013-11-19
I've tried googling for this, but have come up empty.  I'm looking for a Delphi component that would display nothing but images (GIF, JPEG) in a listbox format.  The component would need a scrollbar to scroll through the list, and the ability to select an item (image) from the list (through some method of clicking and highlighting the image) and return to the calling procedure either the filename of the image (preferred) or the index number.

The images should be stacked on top of each other, just like a regular TListBox component does.  A nice option would also be to have a check box available next to each image.

Has anyone come across such a component?

And please, just don't answer, "Go to Torry's and look there".  I've looked.  Only two components come close.  One is a component that you cannot open their DPK without generating errors and the other offering is from an author who does not speak English.  Not much to choose from.

0
Comment
Question by:Softtech
  • 11
  • 10
  • 6
27 Comments
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
You can do something like this. I loaded the ImageList with the Icons from
the C:\Program Files\Common Files\Borland Shared\Images\Icons directory.


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ImgList, StdCtrls;

type
  TListbox = class(StdCtrls.TListbox)
  public
    procedure DrawItem(Index: Integer; Rect: TRect;
                       State: TOwnerDrawState); override;
    procedure MeasureItem(Index: Integer; var Height: Integer); override;
  end;

  TForm1 = class(TForm)
    ImageList1: TImageList;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TListbox.DrawItem(Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  Canvas.Brush.Color := clWindow;
  Canvas.FillRect(Rect);
  try
    TForm1(Parent).ImageList1.GetBitmap(Index, Bmp);
    Canvas.Draw(Rect.Left, Rect.Top, Bmp);
  finally
    Bmp.Free;
  end;
end;

procedure TListbox.MeasureItem(Index: Integer;
  var Height: Integer);
begin
  Height := TForm1(Parent).ImageList1.Height;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  ListBox1.ItemHeight := ImageList1.Height;
  ListBox1.Style := lbOwnerDrawFixed;
  ListBox1.Items.Clear;
  for i := 0 to ImageList1.Count-1 do
    ListBox1.Items.Add(IntToStr(i));
  if ListBox1.Height < ((ListBox1.Items.Count-1) * ImageList1.Height) then
    ListBox1.Width := ImageList1.Height + GetSystemMetrics( SM_CXVSCROLL )
  else
    ListBox1.Width := ImageList1.Height;
end;

end.
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
I will work to add a checkbox...
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
Now try this:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ImgList, StdCtrls, CheckLst;

type
  TCheckListBox = class(CheckLst.TCheckListBox)
  public
    procedure DrawItem(Index: Integer; Rect: TRect;
                       State: TOwnerDrawState); override;
    procedure MeasureItem(Index: Integer; var Height: Integer); override;
  end;

  TForm1 = class(TForm)
    ImageList1: TImageList;
    CheckListBox1: TCheckListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
    FCheckWidth, FCheckHeight: Integer;

implementation

{$R *.dfm}

procedure GetCheckSize;
begin
  with TBitmap.Create do
    try
      Handle := LoadBitmap(0, PChar(OBM_CHECKBOXES));
      FCheckWidth := Width div 4;
      FCheckHeight := Height div 3;
    finally
      Free;
    end;
end;

procedure TCheckListBox.DrawItem(Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  Canvas.Brush.Color := clWindow;
  Canvas.FillRect(Rect);
  inherited;
  try
    TForm1(Parent).ImageList1.GetBitmap(Index, Bmp);
    Canvas.Draw(Rect.Left, Rect.Top, Bmp);
  finally
    Bmp.Free;
  end;
end;

procedure TCheckListBox.MeasureItem(Index: Integer;
  var Height: Integer);
begin
  Height := TForm1(Parent).ImageList1.Height;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  GetCheckSize;
  CheckListBox1.Items.Clear;
  for i := 0 to ImageList1.Count-1 do
    CheckListBox1.Items.Add(IntToStr(i));
  if CheckListBox1.Height < ((CheckListBox1.Items.Count-1) * ImageList1.Height) then
    CheckListBox1.Width := ImageList1.Height + GetSystemMetrics( SM_CXVSCROLL ) + FCheckWidth
  else
    CheckListBox1.Width := ImageList1.Height + FCheckWidth;
end;

end.
0
 

Author Comment

by:Softtech
Comment Utility
>> You can do something like this. I loaded the ImageList with the Icons

But will it handle JPEGs and GIFs?
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
I did not take that into account. I have seen a jpegimagelist on the
newsgroups that may work for you to replace the std one I used.

Otherwise, how do you propose that you are going to load your images?
0
 

Author Comment

by:Softtech
Comment Utility
>> how do you propose that you are going to load your images?

I don't know.  That's why I posted this question seeking assistance.  :-)
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
I mean WHERE are you loading them from?
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
If you want to "include" them with your proram, you can either load them as resources or
place them in a directory and load them at run-time. I need more info.
0
 

Author Comment

by:Softtech
Comment Utility
>> I mean WHERE are you loading them from?

From a folder on the user's hard drive.
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
ok, will there be both Jpegs and GIFs and will the all be the same size?
0
 

Author Comment

by:Softtech
Comment Utility
>> ok, will there be both Jpegs and GIFs and will the all be the same size?

Most likely they will all be of one flavor or another.  IOW, they will either be all GIFs or all JPEGs.

Same size?  As in file size, or as in width and height?  If the latter, then yes, they will all be the same width and height.
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
dimension, yes. good...
will work on it today.
0
 
LVL 33

Expert Comment

by:Slick812
Comment Utility
hello Softtech , , since you have asked this question with the requirement that you need to use the  .GIF  image file format, I guess I should ask you --> How do you want to deal with these  .GIF files ? ?, That is, Delphi does  NOT come with any code or components for dealing with the  .GIF files (delphi does come with the TJPEGImage for the JPEG file format), so to use any .GIF files you will need some component or code to deal with them ? You can get a component that can use .GIF at many of the component download places like Torrys.

Also, I wonder why you want to use a TListBox ?, A TListBox is designed to have text in it, and you have no text, just images, It seems like a delphi  TDrawGrid might be a better thing to use.

also. .  I wonder, you seem to want to display the image files in a folder, this can take up Alot of memory and resources if you get many images in a folder and display them in a scroller at full size (let's say 250 image files that are 800x1000 pixels in size),, , wouldn't having thumbnails (smaller images for the scroller) be more efficient?
maybe you can give a little more info about some factors you want to show in your scroller.
0
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 

Author Comment

by:Softtech
Comment Utility
>> That is, Delphi does  NOT come with any code or components for dealing with the  .GIF files

I have a third party component that adds GIF support to D3 and D5.

>>  I wonder why you want to use a TListBox

I really don't care what you call it, as long as it displays a list of images in a scrollable format, where one image can be double clicked and the itemindex value returned or the name of the image.  The ability to display (or not display) a check box next to each item/image in the list is also desired.

I'm trying to create a graphical menu for school children and non-English reading users to select topics from.  That's the reason for the image part of this request.

>>  I wonder, you seem to want to display the image files in a folder

I was hoping that this component would work a bit differently, in that a stringlist stores all of the image names, and the actual component only loads/displays those images that would be visible to the user.  IOW, if the component was 500 pixels high, and each image 100 pixels high, then only 5 images at a time need to be displayed.  Moving through the component with a scroll bar would load and unload the images so that only 5 images at any given moment are in memory and on the screen.
0
 
LVL 33

Expert Comment

by:Slick812
Comment Utility
OK, , I have some more about what you want, , if you have a GIF handling component allready instaled, then this becomes more possible to do without special GIF code, , I am assuming that this GIF comonent is a "Good" one and that it automatically sets itself into the Delphi TPicture, so to can load a .GIF file with code like -

var
LoadPic: TPicture;
begin
LoadPic := TPicture.Create;
LoadPic.LoadFromFile('E:\APic.gif'); // successfully loads the gif file OR a JPG file
end;

You should try a TDrawGrid for this, you could have Two columns the first a narrow one with your check box and the second one as 100 pixels wide (or the thumbnail width of image) so you could do the check box thing. . . You can just draw your ImageList Index in the -
procedure TForm1.DrawGrid1DrawCell(  );
event.

I really do NOT feel that your idea of - " then only 5 images at a time need to be displayed and so that only 5 images at any given moment are in memory" is an effective one because of the time required to load a disk file, , , if you limit your images to 100x100 pixels then you should be able to effectively use a TImageList  for your image storage of all images in the folder (up to a certain amount, hopefully not very large amount of files)
0
 

Author Comment

by:Softtech
Comment Utility
Yes, my third party GIF component works with TPicture as you've described above.

>>I really do NOT feel that your idea of - ...is an effective one because of the time required to load a disk file
>> if you limit your images to 100x100 pixels

The images are 384 x 89 and are less than 10kb each.
0
 
LVL 33

Expert Comment

by:Slick812
Comment Utility
Ouch! !
Thats seem like a large image size to have, it does not matter what the file size is for a GIF or JPG, it is used and stored as a 24 bit or 32 bit bitmap (if you use a TImageList), I beleive that would be over 100 Kb per image in 24 bit display, although that still managable if you have less than 100 images in the folder for the image list
0
 
LVL 33

Assisted Solution

by:Slick812
Slick812 earned 200 total points
Comment Utility
here is some basic demo code for you to see what it does, I use a TDrawGrid and a TImageList and a TButton. . . The ImageListA is set to Width= 90, Height= 90, and Masked= False. .
The  DrawGrid1  is set to DefaultRowHeight= 94, ColCount= 2, Color= clAqua, DefaultDrawing= False, FixedCol and FixedRow= Zero, Width= 148, RowCount= 1,




    ImageListA: TImageList;
    but_LoadJpegs: TButton;
    DrawGrid1: TDrawGrid;
    procedure FormCreate(Sender: TObject);
    procedure but_LoadJpegsClick(Sender: TObject);// button OnClick Event
    procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState); // add this Event for your  DrawGrid1 OnDrawCell
    procedure DrawGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer); // add this Event for your  DrawGrid1 OnMouseDown
  private
    { Private declarations }
    aryBool: Array of Boolean;



procedure TForm1.FormCreate(Sender: TObject);
begin
DrawGrid1.ColWidths[0] := 18;
// the first column if for check
DrawGrid1.ColWidths[1] := 104;
// this is just my demo image width,
end;


procedure TForm1.but_LoadJpegsClick(Sender: TObject);
var
aFolder: String;
i, n: Integer;
SearchR: TSearchRec;
StrList: TStringList;
aPic: TPicture;
aBmp: TBitmap;
begin
aFolder := 'E:\';
StrList := TStringList.Create;
if FindFirst(aFolder+'*.jpg', faAnyFile, SearchR) = 0 then
  begin
  StrList.Add(SearchR.Name);
  while FindNext(SearchR) = 0 do
    StrList.Add(SearchR.Name);
  FindClose(SearchR);
  end;
if StrList.Count > 1 then
  begin
  ShowMessage(StrList[0]+' '+StrList[StrList.Count-1]+' '+IntToStr(StrList.Count));

  aPic := TPicture.Create;
  aBmp := TBitmap.Create;
  aBmp.Width := 90;
  aBmp.Height := 90;
  for i := 0 to Pred(StrList.Count) do
    begin
    aPic.LoadFromFile(aFolder+StrList[i]);
    aBmp.Canvas.Rectangle(0,0,90,90);
    aBmp.Canvas.Draw(0,0,aPic.Graphic);
    ImageListA.Add(aBmp, nil);
    end;
  FreeAndNil(aPic);
  FreeAndNil(aBmp);
  ImageListA.Draw(Canvas,400,60,0);
  DrawGrid1.RowCount := ImageListA.Count;
  SetLength(aryBool, DrawGrid1.RowCount);
  for n := 0 to High(aryBool) do
    aryBool[n] := False;
  end;

FreeAndNil(StrList);
end;

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
if aCol = 0 then
  begin
  if (ARow < Length(aryBool)) and aryBool[ARow] then
    DrawGrid1.Canvas.Brush.Color := clRed
    else
    DrawGrid1.Canvas.Brush.Color := clWhite;

  DrawGrid1.Canvas.Rectangle(Rect.Left+2,Rect.Top+36,Rect.Left+16, Rect.Top+50);
  end;

if aCol = 1 then
  if ARow < ImageListA.Count then
    ImageListA.Draw(DrawGrid1.Canvas,Rect.Left+2,Rect.Top+2,ARow);

end;

procedure TForm1.DrawGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

var
ACol, ARow: Integer;
begin
if X < 18 then
  begin
  DrawGrid1.MouseToCell(X, Y, ACol, ARow);
  if ARow < Length(aryBool) then
    begin
    aryBool[ARow] := not aryBool[ARow];
    DrawGrid1.Update;//  Invalidate;
    end
  end;
end;


 = = = = = = = = = = = = = = = = = = = = = = = = = =
you should be able to add any other functioning you need to this basic demo
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
Softtech,
  I have been trying to get an answer from the GraphicEX support and newsgroups about
an issue I am having with converting from GIF to BMP for usage in the sample I posted
above. I will try one more time today then I will leave the question open to others.
I do think, however, that you should give the idea of using a TDrawGridby Slick812 some merit.

What GIF library are you using, anyway?
0
 

Author Comment

by:Softtech
Comment Utility
>> What GIF library are you using, anyway?

TGIFImage version 2.2 by Anders Melander (see http://www.delphi32.com/vcl/673/ )
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
And what version of Delphi, because TGifImage has been "depricated" to the JEDI VCL.
0
 
LVL 33

Expert Comment

by:Slick812
Comment Utility
Softtech , ,  I hope the code I gave for you has some of what you may need for this,  I guess I should have said that you can also use a TJPEGImage or a TGIFImage instead of the TPicture, however the TPicture offers you a way to load all of the Image File formats recognized by the Delphi Graphics with a single line of code. Ask questions if you want some more information.
0
 

Author Comment

by:Softtech
Comment Utility
>> And what version of Delphi

I prefer Delphi 3, but have been known to use Delphi 5.
0
 

Author Comment

by:Softtech
Comment Utility
>>     aryBool: Array of Boolean;

>>  FreeAndNil(aPic);
>>  FreeAndNil(aBmp);

These are not valid Delphi 3 functions.

If I try to run the above code in Delphi 5, I can compile the project but when I click on the button I get an error:

Project xxxx raised exception class EInvalidGraphic with message 'Unknown picture file extension (*.jpg)'.
0
 

Author Comment

by:Softtech
Comment Utility
Looks like I needed to add:

JPEG

...to the USES section of the form to resolve the error message.

OK, so the above code compiles in Delphi 5.  I had to tweak alot of the image dimensions that you've hardcoded into the code.

One of the things I don't like about the resulting product is that this really doesn't behave as a pick list, i.e., there is no color inversion occuring when the user clicks on an image in the list.

Also, a spare image is painted on the form, which I haven't figure out how to stop.
0
 
LVL 33

Expert Comment

by:Slick812
Comment Utility
I do not know what you may want this to do, as far as the  " there is no color inversion occuring ", I really did not think this to be useful since it was a checkbox type of user input, You might look at the Delphi help for the TImageList, it has a  DrawingStyle  property which you can set to  dsSelected  so your image will be draw blended with the system select color, which I am really guessing (??) that you mean by "color inversion", however if you actually mean that you need to Invert the colors, it will not nativly do that. . .
As I said this is just demo code for you to have it do what you want. . . there's only one line of code that draws on the form, just comment it out

0
 
LVL 26

Accepted Solution

by:
EddieShipman earned 200 total points
Comment Utility
I was unaware that you required the inversion or selected color "look". But here is the CheckListBox with
JPEG and GIF. I used another 3rd-party GIF control that made things much easeir to work with.

GIFView By William Schroeder.
GIFView is a freeware DLL for converting a GIF image from a file or data buffer to a Windows bitmap
resource. A Delphi component TGif (descendant of TImage) is provided to show how to dynamically
load the DLL and use the functions.

Fully functional
Source: Included

Download: http://www.torry.net/vcl/graphics/gif/gifviewdll.zip

Although it says it is for D4, you can install the control in D3 or D5 as well, just create a new package
instead of using the one in the zip file. Also, if you only want to use the DLL for the conversion, the source
can be changed to only use the DLL .vs using the TGif control. If this is desired, let me know and I'll modify
the source to do that, instead.


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ImgList, StdCtrls, CheckLst, GraphicEx, ExtCtrls, Gif;

type
  TCheckListBox = class(CheckLst.TCheckListBox)
  public
    procedure DrawItem(Index: Integer; Rect: TRect;
                       State: TOwnerDrawState); override;
    procedure MeasureItem(Index: Integer; var Height: Integer); override;
  end;

  TForm1 = class(TForm)
    CheckListBox1: TCheckListBox;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure SearchDirectory(ADirectory: String;
                              AExtension: string;
                              ASearchSubs: Boolean;
                              var AResultList: TStringList);
    procedure LoadImagesIntoImageList;
  end;

var
  Form1: TForm1;
  FCheckWidth, FCheckHeight: Integer;

implementation

{$R *.dfm}

procedure GetCheckSize;
begin
  with TBitmap.Create do
    try
      Handle := LoadBitmap(0, PChar(OBM_CHECKBOXES));
      FCheckWidth := Width div 4;
      FCheckHeight := Height div 3;
    finally
      Free;
    end;
end;

procedure TCheckListBox.DrawItem(Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  Canvas.Brush.Color := clWindow;
  Canvas.FillRect(Rect);
  inherited;
  try
    TForm1(Parent).ImageList1.GetBitmap(Index, Bmp);
    Canvas.Draw(Rect.Left, Rect.Top, Bmp);
  finally
    Bmp.Free;
  end;
end;

procedure TCheckListBox.MeasureItem(Index: Integer;
  var Height: Integer);
begin
  Height := TForm1(Parent).ImageList1.Height;
end;

procedure TForm1.SearchDirectory(ADirectory: String;
                                  AExtension: string;
                                  ASearchSubs: Boolean;
                                  var AResultList: TStringList);
var
  aSearchRec: TSearchRec;
  sOldDirectory: String;
  bExitLoop: boolean;
begin
  // let's wait until this is set to true before exiting
   bExitLoop := FALSE;
  // store the current directory
   sOldDirectory := ADirectory;
  // if This is a directory
  if (FindFirst(ADirectory + '\*.*', faAnyFile, aSearchRec)=0) then
  repeat
    // we are going to recurse this function on a found directory
    // which is now stored in aSearchRec.Name
    // we skip the directory entries named . and ..
    //
     if ((aSearchRec.Attr = faDirectory) and (ASearchSubs)) then
     begin
       if not ((aSearchRec.Name = '.') or (aSearchRec.Name = '..')) then
         SearchDirectory(sOldDirectory + '\' + aSearchRec.Name, AExtension, ASearchSubs, AResultList);
     end
     else
     begin
      // we found a file instead
      // so store the directory and filename to the list
       if (Pos(AExtension, aSearchRec.Name) > 0) then
         AResultList.Add(ADirectory + '\' + aSearchRec.Name);
     end;

    // if we are not at the end of the search list, go back to the starting directory
     if not (FindNext(aSearchRec) = 0) then
     begin
      // and exit the recursive loop
       ADirectory := sOldDirectory;
       bExitLoop := TRUE;
     end;
   until bExitLoop;
  // close the searchrec
  FindClose(aSearchRec);
end;


procedure TForm1.LoadImagesIntoImageList;
var
  Image1: TImage;
  Gif1: TGif;
  FL: TStringList;
  i: Integer;
  bmp: TBitmap;
  GraphicClass: TGraphicExGraphicClass;
  Graphic: TGraphic;
begin
  Image1 := TImage.Create(nil);
  Gif1   := TGif.Create(nil);
  Image1.Parent := Form1;
  Image1.AutoSize := True;
  Image1.Visible := False;
  Gif1.Parent := Form1;
  Gif1.AutoSize := True;
  Gif1.Visible := False;
  FL := TStringList.Create;
  bmp := TBitmap.Create;
  try
    // set the sorted property to false
    // although in my testing, it doesn't make a difference
     FL.Sorted := False;
    // clear it out just in case
     FL.Clear;
    // search for JPGS the directory and subs, if the SearcSubs checkbox is checked
    SearchDirectory('C:\drvrtmp', 'jpg', True, FL);
    for i := 0 to Fl.Count-1 do
    begin
      Image1.Picture.LoadFromFile(FL[i]);
      bmp.Assign(Image1.Picture.Graphic);
      ImageList1.Add(bmp, nil);
      Image1.Picture := nil;
    end;
    // Have to do this twice to load the ImageList with the GIF Files
    FL.Clear;
    SearchDirectory('C:\drvrtmp', 'gif', True, FL);
    // Here, we are going to use a control called TGif to do our "conversion"
    // for us.
    for i := 0 to Fl.Count-1 do
    begin
      // set the GIFFile property to the Gif file name
      Gif1.GIFFile := FL[i];
      // now assign it to the bitmap for the "conversion"
      bmp.Assign(Gif1.Picture.Graphic);
      // and add it to the ImageList
      ImageList1.Add(bmp, nil);
      Image1.Picture := nil;
      Gif1.Picture := nil;
    end;
  finally
    // and free the holder list and image controls
    FL.Free;
    Gif1.Free;
    Image1.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: INteger;
begin
  LoadImagesIntoImageList;
  GetCheckSize;
  CheckListBox1.Items.Clear;
  for i := 0 to ImageList1.Count-1 do
    CheckListBox1.Items.Add(IntToStr(i));
  if CheckListBox1.Height < ((CheckListBox1.Items.Count-1) * ImageList1.Height) then
    CheckListBox1.Width := ImageList1.Height + GetSystemMetrics( SM_CXVSCROLL ) + FCheckWidth
  else
    CheckListBox1.Width := ImageList1.Height + FCheckWidth;
end;

end.
0

Featured Post

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Learn how to use the remote presentation tool in Prezi to allow you to harness the power of this cloud based presentation platform. You can show your presentation with a remote audience using this free tool.
It’s easy to embed any of your public Prezi presentations on your website or social network to share with others. Learn how simple it is in this tutorial.

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

6 Experts available now in Live!

Get 1:1 Help Now