Solved

How to make events on "create on fly object"?

Posted on 2002-07-02
13
689 Views
Last Modified: 2012-08-14
How to make events on "create on fly object"?
Here is my program:

procedure TForm1.Button1Click(Sender: TObject);
var
   pnl : tpanel;
   img : timage;
begin
     pnl := tpanel.create(self);
     pnl.parent := form1;
     pnl.Height := 150;

     img := timage.create(self);
     img.parent := pnl;
     img.Picture.LoadFromFile('k:\my garfield.bmp');

//   img.onclick(sender);  --> but i want to make like:
//   img.onclick = call procedure xyz(pnl, img) like this below..
//
//     procedure TForm1.xyz(frompanel : tpanel;  fromimage : timage);
//     begin
//          frompanel.color := clblue;   --> selected
//          image1.picture := fromimage.picture;
//     end;
//
//   How I can make event img.onclick like I call a procedure ???
//   Because img is created on fly, event is not located in object_inspector-events..
//   So, where I can put program on procedure img.onclick(sender)??
//
end;

Thank's for help


Han
0
Comment
Question by:boyfn78
  • 6
  • 3
  • 2
  • +2
13 Comments
 
LVL 5

Expert Comment

by:Hamlet081299
ID: 7125777
procedure TForm1.ImgClick(Sender: TObject);
var
  frompanel: tpanel;  
  fromimage: timage;
begin
     fromimage := (Sender as TImage);
     frompanel := (fromimage.parent as TPanel);

     frompanel.color := clblue;   // --> selected
     image1.picture := fromimage.picture;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  pnl : tpanel;
  img : timage;
begin
    pnl := tpanel.create(self);
    pnl.parent := form1;
    pnl.Height := 150;

    img := timage.create(self);
    img.parent := pnl;
    img.Picture.LoadFromFile('k:\my garfield.bmp');
    img.onclick := ImgClick;
end;

0
 

Author Comment

by:boyfn78
ID: 7128609
Hi Hamlet,

Your solution is Very Good.. Excellent!! But I can't access frompanel.child (TMemo).
I make like this :
  txt := TMemo.create(self);
  txt.parent := pnl;

So, pnl have 2 child:  1 is img, 1 else is txt.

If I click img as sender to my procedure,
I can access pnl by  "frompanel := (fromimage.parent as TPanel)", right?
But, How I can access txt?
  --> fromtext := (frompanel.???? as TMemo);


Actually, I'm making a program (picture viewer like ACDSee), and I got problem:
1. I create many object (2 panel, 1 image, 1 memo) for 1 thumbnail. When I select a directory which contains about 200 picture files (making 200 thumbnail), after 20-30 sec, my computer runs slowly and not responding (not enough memory).
I make declaration using array --> pnl1, pnl2, img, txt : array [1..10000] of tpanel,timage,tmemo. Also, I'm not    using .free / .destroy from freeing memory because it make error, and I don't know why.. :-(
Is my way spent memory? How to anticipate this? Should I using extended memory (XMS)? How?? Any idea please.. ^_^

2. How to select not only 1 object, but select to more object (using CTRL or/and SHIFT)? May Delphi 5 have the function?


Thanks,

Han
0
 
LVL 5

Assisted Solution

by:Hamlet081299
Hamlet081299 earned 78 total points
ID: 7128638
You can find the memo by checking going through the Controls property of the panel, something like...

i := 0;
while (i < pnl.ControlCount) and (not (pnl.Controls[i] is TMemo)) do
  inc(i);
if (i < pnl.ControlCount) then
  mmo := pnl.Controls[i] as TMemo
else
  mmo := nil; // not found???

BUT, this probably is not the best way to do it.  There are a couple of better ways.

1.  Create a frame that contains all the components you need along with the appropriate interactions.  Then create these frames on the fly.

2.  Create a component which creates each of these subcomponents, and retains references to them.


Creating as many controls as you are is fraught with danger.  Windows controls are quite resource intensive.

Some ideas to help avoid creating so many...

1.  Only create as many as will fit on the screen.  When the user scrolls, release the ones that are off screen and create new ones (or recycle the old ones).

2.  Render the display by creating just one set of controls at a time, grabbing a copy of the rendered bitmap and painting that before rendering the next.  This is how the DB Control Grid works, and you can get some ideas by looking at the VCL.
0
 
LVL 33

Expert Comment

by:Slick812
ID: 7130567
hello boyfn78, about your project you say " I create many object (2 panel, 1 image, 1 memo) for 1 thumbnail." this seems like you are trying to do a thumbnail display by creating panels, TImages and memos for each thumbnail, that is may be more than you need to do. I made a thumbnail viewer by using a TDrawGrid, and putting a thumbnail pic and some text in each cell of the grid. Have you considered this? Have you used a TDrawGrid before?
0
 

Author Comment

by:boyfn78
ID: 7130974

Thanks for your help & the ideas.. :-)

I'll try for the ideas, and check it which efficient for my program..


Thanks Hamlet,

Han
0
 

Author Comment

by:boyfn78
ID: 7130982

Hi Slick812,

I haven't tried using TDrawGrid. I don't think to use TDrawGrid. I'll try to use TDrawGrid as you say. May it won't spent any windows resource.

TDrawGrid & TStringGrid, which is more powerfull?


Thanks,

Han
0
Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

 

Author Comment

by:boyfn78
ID: 7130984

Hi Slick812,

I haven't tried using TDrawGrid. I don't think to use TDrawGrid. I'll try to use TDrawGrid as you say. May it won't spent any windows resource.

TDrawGrid & TStringGrid, which is more powerfull?


Thanks,

Han
0
 
LVL 33

Expert Comment

by:Slick812
ID: 7131055
As I said before, a TDrawGrid is more for Graphic (picture) display (that's why it's called a Draw Grid). And a String Grid is more for Text display (why it's called a String Grid).
With a draw grid you need to use the

procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);

to draw the picture (Bitmap) and the text for each cell, You can get click events for each cell.

I used an Array of Bitmaps for the thumbnails

Thumbs: Array of TBitmap;

and a Record for Image Info

type
    PicRec = record
    Path: String[255];
    Name: String[64];
    Sort: String[16];
    Size: Cardinal;
    Width, Height, PicIndex, PicInfo: Word;
    Ext: PicExt;
    WriteTime: TFileTime;
    end;

and an array for the PicRec

PicInfo: Array of PicRec;

You can get the Grid cells to be most any size I used 90X90
pixels for the default, but it is user adjustable. The DrawGrid1DrawCell( ) give needed the info to draw the cell, The Rect of the cell, the Column and Row and the State (selected). You can expand the cell to include alot of text if you need to. But you can not easily enter text into a draw grid, but you can have a tool bar to have buttons to call up dialogs to enter text or colors or sizes.


0
 

Author Comment

by:boyfn78
ID: 7132950
Hi Slick812,

I've tried using TDrawGrid as you said. But it contains error when I select directory which contains about 200 files.
The error message is "EOutOfResources with the message 'The parameter is incorrect'".
But not caused windows hang, just show error message dialog on my program, and I must close my program and run again. Sometimes I must close my delphi and open again.

Here is the program :


procedure TForm1.FormCreate(Sender: TObject);
begin
     drivecombobox1.Drive := 'k';
     directorylistbox1.Directory := 'K:\-- Picture --\Artist\FinKL';
     image1 := timage.create(self);
end;

procedure TForm1.FileListBox1Change(Sender: TObject);
var
   rect : trect;
   grid : tgriddrawstate;
begin
     statusbar1.Panels[0].text := inttostr(filelistbox1.items.count) + ' files';
     DrawGrid1DrawCell(sender, 0, 0, rect, grid);
end;

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
   rl, rr, rt, rb : word;
begin
     if filelistbox1.items.count <> 0 then
     begin
          i := (ARow*4) + ACol + 1;

        if i <= filelistbox1.items.count then
        begin
          rt := rect.top;
          rl := rect.left;
          rr := rect.right;
          rb := rect.bottom;

          drawgrid1.RowCount := (filelistbox1.items.count div column);
          if filelistbox1.items.count mod column <> 0 then
             drawgrid1.rowcount := drawgrid1.rowcount + 1;

          bmp := tbitmap.create;
          jpg := tjpegimage.create;
          if lowercase(extractfileext(filelistbox1.items[i-1])) = '.bmp' then
             bmp.loadfromfile(filelistbox1.items[i-1])
          else
              if lowercase(extractfileext(filelistbox1.items[i-1])) = '.jpg' then
              begin
                   jpg.loadfromfile(filelistbox1.items[i-1]);
                   bmp.assign(jpg);
              end;

          if (bmp.height > drawgrid1.DefaultRowHeight-18) or (bmp.width > drawgrid1.DefaultColWidth-4) then
             if bmp.height > bmp.width then
             begin
                  image1.height := drawgrid1.DefaultRowHeight-18;
                  image1.width := round((bmp.width * image1.height) / bmp.height);
             end
             else
             begin
                  image1.width := drawgrid1.DefaultColWidth-4;
                  image1.height := round((image1.width * bmp.height) / bmp.width);
                  if (image1.height > drawgrid1.DefaultRowHeight-18) or (image1.width > drawgrid1.DefaultColWidth-4) then
                  begin
                       image1.height := drawgrid1.DefaultRowHeight-18;
                       image1.width := round((bmp.width * image1.height) / bmp.height);
                  end;
             end
          else
          begin
               image1.width := bmp.width;
               image1.height := bmp.height;
               image1.top := (drawgrid1.DefaultRowHeight+4-image1.height) div 2;
               image1.left := (drawgrid1.DefaultColWidth+4-image1.width) div 2;
          end;

          rect.top := rect.Top + (rect.bottom - rect.top - 14 - image1.height) div 2;
          rect.Left := rect.left + (rect.right - rect.left + 4 - image1.width) div 2;
          rect.right := rect.left - 4 + image1.width;
          rect.bottom := rect.top - 2 + image1.height;

          if lowercase(extractfileext(filelistbox1.items[i-1])) = '.bmp' then
             drawgrid1.canvas.StretchDraw(rect, bmp)
          else
              if lowercase(extractfileext(filelistbox1.items[i-1])) = '.jpg' then
                 drawgrid1.canvas.StretchDraw(rect, jpg);

          rect.top := rt;
          rect.left := rl;
          rect.right := rr;
          rect.Bottom := rb-16;

          if canvas.textwidth(filelistbox1.items[i-1]) < drawgrid1.DefaultColWidth-2 then
             s := filelistbox1.items[i-1]
          else
          begin
               j := 0;
               while j <= length(filelistbox1.items[i-1])-1 do
                     if canvas.textwidth(copy(filelistbox1.items[i-1], 1, j+1) + '...') > drawgrid1.defaultcolwidth-2 then
                     begin
                          s := copy(filelistbox1.items[i-1], 1, j) + '...';
                          j := length(filelistbox1.items[i-1]);
                     end
                     else
                         inc(j);
          end;

          rect.top := rb - 15;
          rect.bottom := rt + 16;
          rect.left := rl + (rr - rl - canvas.textwidth(s)) div 2;
          drawgrid1.Canvas.TextOut(rect.Left, rect.Top, s);
        end;
    end;
end;


The result if I make using TDrawGrid is a simple thumbnail, looks easy but hard to handle it.
Some trouble from the program above is :
1. Error if selected directory contains  (x mod 4 <> 0)  files. I made TDrawGrid by 4 column (@cell = 100x100), and I used ==>  i := (ARow*4) + ACol + 1;  <== to counter filelistbox1.items. If total files mod 4 <> 0, it still draw each cell until ...
2. Sometimes not refresh (on first row) when changing to other directory.
3. Always refresh when I click on a cells (flicker, looks like picture is load again).

I'd like to use Hamlet's idea which creating a frame that contains all the component and I just create these frames on the fly. Or may be cycling thumbnails method..?

But, thanks for you to give me idea. I'd like use TDrawGrid (first I think to use TStringGrid) for my list_view or details_view. But I'm not sure to make it like windows_explorer-view..
Have some ideas..?  =\^_^/=



Thanks,


Han
0
 
LVL 33

Accepted Solution

by:
Slick812 earned 79 total points
ID: 7133085
Ilooked at your code and I don't understand alot of the methods you used and things you did. I have used my app with Folders having more than 400 graphics files without any out of resources error message. It is no wonder you run out of resources because you seem keep all the Large bitmaps in memory after you create the thumbs. Here some code that may help you.

add Jpeg, and FileCtrl to your Uses clause.

type
  PicRec = record
    Path: String[255];
    Name: String[64];
    Size: Cardinal;
    Width, Height: Word;
    WriteTime: TFileTime;
    end;

  TForm1 = class(TForm)
  DrawGrid1: TDrawGrid;

  private
    { Private declarations }
    Thumbs: Array of TBitmap;
    PicInfo: Array of PicRec;
    Num: Integer;
    Dimention: Word;
    PicRec1: PicRec;
    procedure ThumbNail(Pic1: TPicture; var ThumBmp: TBitmap);
    procedure AddImage(ImagePath: String);
    //procedure LoadFileListBox;


procedure TForm1.FormCreate(Sender: TObject);
begin
Dimention := 100;
{Dimention is the max width and heigh of the Thumbnail}
DrawGrid1.DefaultColWidth := Dimention + 6;
DrawGrid1.DefaultRowHeight := Dimention + (DrawGrid1.Canvas.TextHeight('W')*2) + 6;
DrawGrid1.Color := clSilver;
end;


procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
{VERY IMPORTANT
Free ALL Bitmaps you create}
for i := 0 to High(Thumbs) do
FreeAndNil(Thumbs[i]);
end;

procedure TForm1.ThumbNail(Pic1: TPicture; var ThumBmp: TBitmap);
begin
{this makes a Thumb from the TPicture}
ThumBmp.PixelFormat := pf24Bit;
if (Pic1.Width < Dimention) and (Pic1.Height < Dimention) then
    begin // 1
    ThumBmp.Height := Pic1.Height;
    ThumBmp.Width := Pic1.Width;
    end // 1
  else
  if Pic1.Width < Pic1.Height then
    begin // 2
    ThumBmp.Height := Dimention;
    ThumBmp.Width := Trunc(Dimention / (Pic1.Height / Pic1.Width))+2;
    end else // 2
  if Pic1.Width > Pic1.Height then
    begin // 3
    ThumBmp.Width := Dimention;
    ThumBmp.Height := Trunc(Dimention / (Pic1.Width / Pic1.Height))+2;
    end  else // 3
    begin // 4
    ThumBmp.Width := Dimention;
    ThumBmp.Height := Dimention;
    end; // 4
    ThumBmp.Canvas.StretchDraw(Rect(0,0,ThumBmp.Width,ThumBmp.Height), Pic1.Graphic);
end;

Procedure TForm1.AddImage(ImagePath: String);
var
PicT: TBitmap;
GotImage: Boolean;
FindHandle:HWND;
FindData: TWin32FindData;
ErrorMode: Word;
LoadPic: TPicture;
Str1: String;
begin
{this loads a TPicture from file
TPicture can load all the types of files availible to Delphi
so you don't have to test for .bmp or .jpg}
GotImage := True;
LoadPic := TPicture.Create;
try
LoadPic.LoadFromFile(ImagePath);
except
    on E: Exception do
    begin
    GotImage := False;
    end;
  end;
if GotImage then
begin // GotImage
  PicT := TBitmap.Create;
  ThumbNail(LoadPic,PicT);
  PicRec1.Path := ImagePath;
  Str1 := ExtractFileName(ImagePath);
  Delete(Str1,64,256);;
  PicRec1.Name := Str1;

  PicRec1.Width := LoadPic.Width;
  PicRec1.Height := LoadPic.Height;

  FreeAndNil(LoadPic);
  ErrorMode := SetErrorMode(SEM_FailCriticalErrors);
  FindHandle := FindFirstFile(PChar(ImagePath), FindData);
  SetErrorMode(ErrorMode);
  if FindHandle <> INVALID_HANDLE_VALUE then
  begin
  if (FindData.nFileSizeHigh * MAXDWORD) + FindData.nFileSizeLow < 4294967295 then
  PicRec1.Size := (FindData.nFileSizeHigh * MAXDWORD) + FindData.nFileSizeLow else
  PicRec1.Size := 4294967294;
  PicRec1.WriteTime := FindData.ftLastWriteTime;
  Windows.FindClose(FindHandle);
  end else
  PicRec1.Size := 0;

  if DrawGrid1.ColCount * DrawGrid1.RowCount < (Num+1) then
  DrawGrid1.RowCount := DrawGrid1.RowCount+1;
  SetLength(PicInfo, Num+1);
  PicInfo[Num] := PicRec1;
  SetLength(Thumbs, Num+1);
  Thumbs[Num] := TBitmap.Create;
  Thumbs[Num].Assign(PicT);
  FreeAndNil(PicT);

  Inc(Num);

  {StatusBar1.Panels[0].Text := 'Total - ' + IntToStr(Num);
  StatusBar1.Panels[1].Text := 'File Size - ' + IntToStr(InAlb.Size);}

  Application.ProcessMessages;
end;
end;

procedure TForm1.GetDirThumb1Click(Sender: TObject);
var
  Folder: string;
  FindHandle: THandle;
  FindData: TWin32FindData;
  ErrorMode: Word;
  Ext: PChar;
  i, j: Integer;
begin
num := 0;
Folder := 'C:\';
if SelectDirectory('Pick a Folder for Images','',Folder) then
  begin
  Label1.Caption := Folder;

  {$I-}
  ChDir(Folder);
  {$I+}
  if IOResult <> 0 then
    begin
    MessageDlg('Cannot find directory, no Images added', mtWarning, [mbOk], 0);
    Exit;
    end;
  if Folder[Length(Folder)] <> '\'  then
    Folder := Folder+'\';
{IMPORTANT free all Bitmaps you create}
  for i := 0 to High(Thumbs) do
    FreeAndNil(Thumbs[i]);

  DrawGrid1.Row := 0;
  DrawGrid1.RowCount := 1;
  LockWindowUpdate(DrawGrid1.handle);
  i := 1;
  Ext := '*.bmp';
  for j := 0 to 2 do
    begin
    case j of
      0: Ext := '*.bmp';
      1: Ext := '*.jpg';
      2: Ext := '*.wmf';
      end;
    ErrorMode := SetErrorMode(SEM_FailCriticalErrors);
    FindHandle := FindFirstFile(Ext, FindData);
    SetErrorMode(ErrorMode);
    if FindHandle <> INVALID_HANDLE_VALUE then
      begin
      AddImage(Folder+FindData.cFileName);

      while FindNextFile(FindHandle, FindData) do
        begin
        AddImage(Folder+FindData.cFileName);
        Inc(i);
        if i = (((DrawGrid1.Height-4) div DrawGrid1.DefaultRowHeight) * DrawGrid1.ColCount)-1 then
          begin
          LockWindowUpdate(0);
          DrawGrid1.Update;
          DrawGrid1.Invalidate;
          LockWindowUpdate(DrawGrid1.handle);
          end;
        end;
      Windows.FindClose(FindHandle);
      end;
      end;
  LockWindowUpdate(0);
  if Length(Thumbs) > 0 then
    DrawGrid1.Invalidate;

  end;

end;


procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
IndexNum: Integer;
begin
{IMPORTANT - this is a drawing (paint) function, try not to do
anything here except Drawing operations, don't create images
do image testing or load files if you can avoid it;}

IndexNum := (ARow*DrawGrid1.ColCount)+ACol;
with Sender as TDrawGrid do
  begin
  if IndexNum < Length(Thumbs) then
    begin
    if gdFocused in State then
      begin
      Canvas.Brush.Color := clHighLight;
      Canvas.FillRect(Rect);
      Canvas.Font.Color := clHighLightText;
      end else
      Canvas.Font.Color := clBlack;
    Canvas.Draw(Rect.Left+(((Rect.Right-Rect.Left) div 2)-(Thumbs[IndexNum].Width div 2)),
      Rect.Top+2+((Dimention div 2)-(Thumbs[IndexNum].Height div 2)),Thumbs[IndexNum]);
    SetBkMode(DrawGrid1.Canvas.Handle, TRANSPARENT);
    Canvas.TextOut(Rect.Left+3, Rect.Top+6+Dimention,PicInfo[IndexNum].Name);
    Canvas.TextOut(Rect.Left+3, Rect.Top+8+Dimention+Canvas.TextHeight('W'),'Wid '+IntToStr(PicInfo[IndexNum].Width)+' Hgt '+IntToStr(PicInfo[IndexNum].Height));
    end;
  end;
end;

{procedure TForm1.LoadFileListBox;
var
i: Integer;
begin
FileListBox1.Update;
if FileListBox1.Items.Count < 1 then
  begin
  ShowMessage('There are no files listed to add to this Image Collection');
  Exit;
  end;
Application.ProcessMessages;
Num := 0;
DrawGrid1.Row := 0;

LockWindowUpdate(DrawGrid1.handle);
if FileListBox2.Items.Count > 0 then
  begin
  for i := 0 to High(Thumbs) do
  FreeAndNil(Thumbs[i]);
  DrawGrid1.RowCount := 1;
  for i := 0 to (FileListBox1.Items.Count - 1) do
    begin
    if not FileExists(FolderPath+'\'+FileListBox1.Items.Strings[i]) then
      begin
      MessageDlg('File: ' + FileListBox1.Items.Strings[i] +
                   ' not found', mtError, [mbOk], 0);
      Continue;
      end;
AddImage(FolderPath+'\'+FileListBox1.Items.Strings[i]);
if i = (((DrawGrid1.Height-4) div DrawGrid1.DefaultRowHeight) * DrawGrid1.ColCount)-1 then
  begin
  LockWindowUpdate(0);
  DrawGrid1.Update;
  DrawGrid1.Invalidate;
  LockWindowUpdate(DrawGrid1.handle);
  end;
end;
end;
LockWindowUpdate(0);
end;}



- - - - - - - - - - - - - - - - - - - - - -  - - - - -

se if you can get some ideas on using the DrawGrid from this simplified example
0
 

Author Comment

by:boyfn78
ID: 7134732

I've tried your program and it run successfull. Although the thumbnail not seems like ACDSee (panels, image & texts), it runs more faster than mine. But it still contains error "EOutOfResources with the message 'The parameter is incorrect'". Sometimes I must End Task my delphi and open it again.

On a directory which contais about 400 files, it's ok. I change to other directories which contains less than 400 files, it's ok too. On a directory which contains limit to 500 files, error on reading file at number 255. But, the other directories which contain about 800, 900, upper than 1000 files, sometimes error on reading file at number 300, 750, etc.

I've checked the directories. It only contain JPG & BMP files. Also, I've checked that no files were broken (damage). All files is ok when I checked it by ACDSee. The error still showed when I compile and go first to that directory (I think memory will enough). I don't know why..

Now, I've been trying to make cycle method for safety memory, and check what trick you used to load picture faster. I don't understand a lot of methods you used. May be I still use my method to create panels, but I give a limit and try to cycle it when the user scrolls. And I'll use filelistbox for multiple select. So, when I click on my panel/image, I set filelistbox.selected[index] with toggle True/False.


Thanks for your help & some codes. Sorry if you don't understand what I mean, because my english is not good.. ^_^


Han
0
 

Expert Comment

by:CleanupPing
ID: 9343115
boyfn78:
This old question needs to be finalized -- accept an answer, split points, or get a refund.  For information on your options, please click here-> http:/help/closing.jsp#1
EXPERTS:
Post your closing recommendations!  No comment means you don't care.
0
 
LVL 5

Expert Comment

by:Lukasz Lach
ID: 9459987
boyfn78,
No comment has been added lately (18 days), so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area for this question:

RECOMMENDATION: split points between Hamlet http:#7128638 and Slick812 http:#7131055

Please leave any comments here within 7 days.

-- Please DO NOT accept this comment as an answer ! --

Thanks,

anAKiN
EE Cleanup Volunteer
0

Featured Post

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

Suggested Solutions

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

746 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

17 Experts available now in Live!

Get 1:1 Help Now