[DUG] StringGrid/DBGrid
Kyley Harris
KyleyHarris at gmail.com
Thu Sep 8 13:55:37 NZST 2005
The best way to get it? do you mean.. like.. buy if from Borland?
I would reccomend hanging out for D2006 if you are thinking of 2005.
John Bird wrote:
>I like both options - the Virtual TreeView looks terrific, although there is
>some learning curve
>
>Any advice on the best way to get either D7 or D2005?
>
>John B
>
>-----Original Message-----
>From: Rohit Gupta [mailto:rohit at cfl.co.nz]
>Sent: Thursday, 8 September 2005 9:07 a.m.
>Subject: Re: [DUG] StringGrid/DBGrid
>
>
>I would go for the dbgrid and clientdataset. The virtualtreeview is
>good but does have the initial high cost of setup.... which always
>deters me as I have to relearn it every time I use it. :-)
>
>From: "John Bird" <johnkbird at paradise.net.nz>
>To: "'NZ Borland Developers Group - Delphi List'"
><delphi at ns3.123.co.nz>
>Subject: [DUG] StringGrid/DBGrid
>Date sent: Wed, 7 Sep 2005 15:54:38 +1200
>Organization: John Bird Consulting
>Send reply to: johnkbird at paradise.net.nz,
> NZ Borland Developers Group - Delphi List <delphi at ns3.123.co.nz>
> <mailto:delphi-request at ns3.123.co.nz?subject=unsubscribe>
> <mailto:delphi-request at ns3.123.co.nz?subject=subscribe>
>
>[ Double-click this line for list subscription options ]
>
>I have been using the D5 vanilla StringGrid for displaying data. The data I
>am reading is from non database data files - I am reading it in myself using
>TFileStream.
>
>>From now on I want to be inputting and editing data in grids, but the
>standard StringGrid does not have many embedded cell editors - the one it
>supplies seems pretty simple - it does not do even the things the standard
>editbox one does (move through a string one word at a time etc with Ctrl/W
>etc).
>
>Can anyone who has an opinion on the options below kindly give a
>recommendation! (see below for a tiny reward)
>
>As I see it my options are:
>
>Option 1 - Add a few extra features to the standard stringgrid and use that
>for my stuff.
>____________________________________________________________________________
>______________
>I would need:
> -a enter cell event (to store the current contents of the cell to check
>for changes)
> -a exit cell event (so I can call code to verify any cell changes)
> -someway to know the position on the screen of the current cell in case
>I want to pop up a lookup window If I could do all of these I would have
>all I need. Best way to get these? I could use the onDrawCell event?
>
>Option 2 - DBGrid
>_________________
>I note the DBGrid seems to have a lot more data verification and cell events
>onColEnter and onColExit (are these meant to be called onCellEnter and
>onCellExit?) The help says these are when a cell is entered and exited. If
>it is a colenter and not a cell enter, what happens if the user arrows from
>one cell to the one below it - does it fire?
>
>I notice there is a LoadFromFile and a SavetoFile which looks like I could
>use to get the data into the grid. To use the TDBGrid I could use these
>methods or a TClientDataSet.
>
>Option 3 - use a third party grid control.
>__________________________________________
>So far I haven't needed to do this, but have been wondering about some of
>the 3rd party components like XStringGrid and AliGrid. I like having
>everything vanilla and not having upgrade issues, but also don't wish to
>reinvent the wheel all the time!
>
>Option 4 - TClientDataSet and upgrade _____________________________________
>Now TClientDataSet is not in D5, and some friends (namely Gary B) have been
>long telling me this is the simplest way to display, edit and manipulate
>data (using DBGrid), so it might be time to upgrade, hence look at D7 or
>D2005. I think the stuff I have done so far is unlikely to break D2005, so
>happy to look at either. Best sources of an upgrade?
>
>
>Reward
>______
>For reading this far here is a tiny reward: a little bit of code I wrote to
>sort a standard stringgrid. Very fast. Note it only does (case insensitive)
>alpha compares, but could easily be modified to do other orderings. As I
>already put in numbers right justified into grids it also works for numbers
>for me.
>
>It makes a tag stringlist which is sorted in one step, then copies the
>original data into a temporary array and then puts it back in the new order
>to the original stringgrid. While a bit more work, it is a lot faster than
>using a two record at a time exchange or a bubblesort. It also allows
>sorting by two columns.
>
>If there is anything I have done you would like to improve kindly tell me!
>
>procedure xcSortGrid(var
>PGrid:TStringGrid;SortColumn1:Integer;SortColumn2:integer;AscDesc:char;CaseI
>nSensitive:Boolean);
>var
>UnsortedList:TStringList;
>olddefrow,newdefrow:integer; //keep same data row as default
>oldrow,datalhs,ptr,colptr,rowptr:integer;
>tempstr:string;
>lAscDesc:char;
>tempcells:array of array of string;
>begin
> if PGrid.rowcount < 2 then exit; //nothing to sort
> UnsortedList:=TStringList.Create;
> UnsortedList.sorted:=false;
> olddefrow:=-1;
> NewDefRow:=-1;
> if PGrid.row>0 then oldDefRow:=PGrid.row;
> for ptr:=0 to PGrid.rowcount-1 do
> begin
> //put sort col plus orig pointer into stringlist
> tempstr:=PGrid.cells[SortColumn1,ptr]+PGrid.cells[SortColumn2,ptr];
> if CaseInsensitive=true then uppercase(tempstr);
> xcstrpad(tempstr,60); //make the string 60 chars long
> tempstr:=tempstr+inttostr(ptr);
> UnSortedList.Add(tempstr);
> end;
> //sort it
> UnSortedList.sorted:=true;
> //now copy original cells to tempcells dynamic array
> setlength(tempcells,PGrid.colcount,PGrid.rowcount);
> for rowptr:=0 to PGrid.rowcount-1 do
> begin
> for colptr:=0 to PGrid.colcount-1 do
> begin
> tempcells[colptr,rowptr]:=PGrid.cells[colptr,rowptr];
> end;
> end;
> //now write back to grid
> lAscDesc:=upcase(AscDesc);
> if lAscDesc='A' then
> begin
> for ptr:=0 to PGrid.rowCount-1 do
> begin
> tempstr:=copy(UnSortedList[ptr],61,10);
> oldrow:=strtoint(tempstr);
> if oldrow=oldDefRow then NewDefRow:=ptr;
> //oldptr is orig row number, ptr is new row number
> for colptr:=0 to PGrid.colcount-1 do
> begin
> PGrid.cells[colptr,ptr]:=tempcells[colptr,oldrow];
> end;
> end;
> end
> else
> begin
> for ptr:=PGrid.rowcount-1 downto 0 do
> begin
> tempstr:=copy(UnSortedList[ptr],61,10);
> oldrow:=strtoint(tempstr);
> if oldrow=oldDefRow then NewDefRow:=ptr;
> //oldptr is orig row number, ptr is new row number
> for colptr:=0 to PGrid.colcount-1 do
> begin
> PGrid.cells[colptr,ptr]:=tempcells[colptr,oldrow];
> end;
> end;
> end;
> UnsortedList.free;
> tempcells:=nil;
> if (OldDefRow>0) and (NewDefRow >=0) then PGrid.row:=NewDefRow;
> //note this means if the current row was 0 (the top) the new default row
>after sorting is still the top,
> //which is generally the best sense.
>end;
>
>
>John B
>
>
>_______________________________________________
>Delphi mailing list
>Delphi at ns3.123.co.nz http://ns3.123.co.nz/mailman/listinfo/delphi
>Regards
>
>Rohit
>
>======================================================================
>CFL - Computer Fanatics Ltd. 21 Barry's Point Road, AKL, New Zealand
>PH (649) 489-2280
>FX (649) 489-2290
>email rohit at cfl.co.nz or r.gupta at xtra.co.nz
>======================================================================
>
>
>
>
>_______________________________________________
>Delphi mailing list
>Delphi at ns3.123.co.nz
>http://ns3.123.co.nz/mailman/listinfo/delphi
>
>
>
--
Plus he has a weakness for what we can mischievously call sesquipedalian excess: Look out for such terms as "epiphenomenal," "diegetic" and "proprioceptive."
--Jabari Asim, "Reel Pioneer," Washington Post, November 19, 2000
More information about the Delphi
mailing list