Newsgroup: it.comp.lang.delphi
Titolo: Accodare due stringGrid

Ho due stringgrid contenenti i seguenti dati
 
StringGrid1 StringGrid2 (2 colonne)
 
1                             6  rossi
 
2                             4  bianchi
 
3                             8  bianchi
 
4                             1  rossi
 
5
 
6
 
7
 
8
 
Vorrei poter accodare alla StringGrid2 i numeri contenuti nella StringGrid1
 
che mancano nella StringGrid2 (lasciando inalterati i dat di questa ultima) 
in modo di avere
 
?
 
StringGrid2
 
6 rossi
 
4 bianchi
 
8 bianchi
 
1 rossi
 
2
 
3
 
5
 
7
 
Ho cercato sulla rete ma non ho trovato un suggerimento.
 
Grazie per una risposta
 
 

 ha scritto nel messaggio 
news:509daa62$0$17948$4faf...@reader1.news.tin.it...

CHISSà Se ho capito bene, vediamo:
 
 
 
procedure accodasg( var sg1,sg2:tstringgrid);
var c,r,k :integer;
begin
k:=stringgrid1.rowcount:;
for r:=0 to stringgrid2.rowcount-1 do begin
stringgrid1.rowcount:=stringgrid1.rowcount+1;
for c:=0 to stringgrid2.colcount-1 do begin
strinmggrid1.cells[c,k+r]:=stringgrid2.cells[c,r];
end;
end;
 
end;
 
 
 
tuttp cioì' assumendo che le stringgrid abbiano lo stesso numero di 
colonne..... 
 

Ti ringrazio per la tua risposta,ma non hai capito cosa intendo fare.
 
Se nella colonna1 della St1 vi sono i seguenti valori 1,2,3,4,5,6,7,8 e 
nella colonna2 i valori sono vuoti
 
e nella colonna1 della St2 i valori sono 4,2,7 e nella colonna2 i valori 
sono a,b,c
 
vorrei accodare alla St2 nella colonna1 i valori 1,3,5,6,8 dalla prima riga 
vuota e lasciare inalterati i valori 4,2,7, a,b,c
 
(in altre parole devo prendere dalla St1 tutti i valori TRANNE quelli che 
gi� esistono nella St2).
 
(e lasciando allo stesso tempo sincronizzati nella St2 i valori 4-a,2-b,7-c)
 
(in altri termini ancora le prime tre righe di St2 devono rimanere invariate
 
e poi accodare i valori che mancano,colonna1 di St1(1,3,5,6,8) e colonna2 di 
St1 con valori vuoti.
 
Non credo ci sia bisogno di agire sulle colonne come da tuo codice,ma 
solamente sulle righe
 
ho provato e riprovato un sacco di varianti al codice di cui sotto,ma non 
sono riuscito a risolvere.
 
Praticamente non riesco a fare il confronto tra le righe diverse vedi if 
<>,forse ci vuole un Break o simile.
 
Grazie per un tuo gentile suggerimento
 
LuigiPaolo
 
?
 
for r1 := 1 to st1.RowCount - 1 do
 
for r2 := 1 to st2.RowCount - 1 do
 
if st1.Cells[0,r1] <> st2.Cells[0,r2]
 
then begin
 
st2.Cols[0].Append(st1.Cells[0,r1]);
 
end;
 
 

 end;
 
Rifletti un po' di piu' su come risolvere il problema "manualmente"
senza scrivere codice, e' qualcosa di questo tipo?
 
Ripeti per tutte le righe di St1
Se la riga NON e' presente in St2 allora
  Aggiungila a St2
 
Devi solo tradurre in codice delphi
 
ciao
Giacomo
 
 
 
 

 vuota e lasciare inalterati i valori 4,2,7, a,b,c
 
Anzitutto, potresti lasciar perdere string e grid, semplificandoti
alquanto la vita. Da quel che leggo, da due array (o liste
indicizzate) A e B. Vuoi ottenerne un terzo, C, contenente tutti gli
item di B e quelli di A con indice non presente in B.
 
Fallo, poi "pulisci" la stringgrid di destinazione, e scrivici dentro
C.
 
Saluti
Paolo Arosio
 
PS non che sia complicato fare il lavoro sulla stringgrid, ma è
"sbagliato".
PPS fossero due tabelle, sarebbe
select a, b from B union select a, b from A where a not in (select a
from B);
PPPS non che ti consigli di tirar su un db per farlo, neh?

Ripeti per tutte le righe di St1
Se la riga NON e' presente in St2 allora
  Aggiungila a St2
Devi solo tradurre in codice delphi
///////////////
 
 
Caro amico,nonostante i miei sforzi non riesco a risolvere
 
risolvo solo se confronto con <>'4' and <>'2' ,ma chiaramente non basta!
 
cos� nello esempio non accodo i valori 4 e 2 se sono presenti nella St2
 
Ti chiedo se � possibile un ulteriore aiuto,le due StringGrid devono essere
 
necessariamente visualizzate da chi user� il programma
 
(Serve per calcolare i turni nel gioco degli scacchi)
 
Lo stesso programma lo avevo fatto e finito usando un DB (AbsoluteDataBase)
 
e in questo caso con una join query avevo risolto,ora vorrei rifare lo 
stesso algoritmo
 
basandomi per� su file di testo e non su DB,purtroppo mi sono impantanato...
 
Comunque grazie.
 
?
 
for r1:=0 to St1.RowCount-1 do
 
// if (st1.Cells[0,r1]<>(st2.Cells[0,r1])
 
 
if (st1.Cells[0,r1]<>'4')
 
and (st1.Cells[0,r1]<>'2')
 
then begin
 
st2.Cols[0].Append(st1.Cells[0,r1]);///cos� risolvo
 
 
 
 
 

 necessariamente visualizzate da chi userà il programma
 
Concentrati su un problema alla volta: lascia perdere l'accodamento
perche' sai gia' farlo correttamente. Pensa al problema di determinare
se un determinato valore e' gia' presente oppure no in una griglia.
Scrivi una funzioncina per risolvere quel problema e poi devi solo
usarla nel tuo IF:
 
for r1 := 0 to st1.RowCount-1 do
  if not GiaPresente( st1.cells[0,r1], st2 ) then
    st2.Cols[0].Append(st1.Cells[0,r1]);///così risolvo 
 
ciao
Giacomo

Nella mia ignoranza ho pensato la funzione di cui sotto,purtroppo mi d�
 
un errore:
 
Incompatible types TStringGrid and String
 
////if not GiaPresente(st1.cells[0,r1],st2) then (errore qui)
 
Purtroppo sono un pessimo allievo... ti prego non farmi perdere chiss� 
quanti giorni...
 
function GiaPresente(St1: TStringGrid ;St2: TStringGrid): Boolean;
 
begin
 
if St1.Cols[0]=St2.Cols[0]
 
then
 
begin
 
Result :=True;
 
end;
 
end;
 
 

Credo di aver risolto...
Correggimi se sbaglio o se bisogna perfezionare
Grazie.
 
  function GiaPresente(a1: String ; a2: TStringGrid): Boolean;
    var
    r1: integer;
     begin
     for r1 := 0 to a2.RowCount-1 do
    if (a1=a2.Cells[0,r1])


     end;
 
ciao
Giacomo

     end;