PDA

Ver la Versión Completa : Uso de StringGrid


jlalonso1950
31-12-2017, 16:06:55
Soy nuevo en estos abatares, y estoy tratando de cargar un stringgrid en base a informaciñon existente en otros, y tengo problemas al usar, mejor dicho, no se bien como usar assign() necesito ayuda al respecto

ecfisa
31-12-2017, 17:30:35
Hola jlalonso1950, bienvenido a los foros de Club Delphi :) y como es costumbre con los que comienzan, te invitamos a leer nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php).

Es necesario que des mas información acerca de tu problema, ayudaría mucho que describieras la situación donde deseas usar el método Assign (que intentas lograr con ese método).
Y si además agregas algún código de ejemplo mucho mejor, cuanta mas información nos brindes mas podremos ayudarte.

Saludos :)

jlalonso1950
31-12-2017, 19:43:47
Buenas Tardes, el problema que tengo es que estoy preparando una clase donde vamos a aplicar el método simplex, un metodo de Invetigación de Operaciones, se entra por un form si se va a Maximizar o Minimizar, el número de variables y restricciones, coeficientes de etos últimos datos que se entran por dos StringGrid y que despues se agrupan en un tercero, en codigo:

StringGrid1->Cells[0][1]="COEF.";
StringGrid1->ColCount=StrToInt(Edit2->Text)+1;
StringGrid2->ColCount=StrToInt(Edit2->Text)+3;
StringGrid2->RowCount=StrToInt(Edit3->Text)+1;
for(i=1;i<=StrToInt(Edit2->Text);i++){
StringGrid1->Cells[i][0]=" X "+IntToStr(i);
StringGrid2->Cells[i][0]=" X "+IntToStr(i);
}
StringGrid2->Cells[StrToInt(Edit2->Text)+1][0]="Signo";
StringGrid2->Cells[StrToInt(Edit2->Text)+2][0]="PD";
for(j=1;j<=StrToInt(Edit3->Text);j++){
StringGrid2->Cells[0][j]=" C "+IntToStr(j);
if(RadioButton1->Checked){ //simplex puro
StringGrid2->Cells[StrToInt(Edit2->Text)+1][j]="<=";
Button2->Enabled=true;
}
else if(RadioButton2->Checked){ //existen varias complicacioes+mimizado
Button3->Enabled=true;
}
else{
Button4->Enabled=true; // varias complicaciones maximizado
}
}

ahora se pasa por un boton a un groupbox, para no salir del forma inicial, donde:

int i,j,k,m;
StringGrid3->ColCount=StrToInt(Edit2->Text)+StrToInt(Edit3->Text)+2;
StringGrid3->RowCount=StrToInt(Edit3->Text)+2;
StringGrid3->Cells[0][0]=" VB";
StringGrid3->Cells[0][1]=" Z";
for(i=1;i<=StrToInt(Edit3->Text);i++){
StringGrid3->Cells[0][i+1]=" C"+IntToStr(i);
}
for (j=1;j<=StrToInt(Edit2->Text);j++){
StringGrid3->Cells[j][0]=" X"+IntToStr(j);
}
for(m=1;m<=StrToInt(Edit3->Text);m++){
StringGrid3->Cells[StrToInt(Edit2->Text)+m][0]=" C"+IntToStr(m);
}
StringGrid3->Cells[StrToInt(Edit2->Text)+StrToInt(Edit3->Text)+1][0]=" PD";
//cargar valores de los stringrid 1 y 2 en el 3 y ejecutar ' mi problema

GroupBox1->Visible=true;

jlalonso1950
31-12-2017, 20:09:35
ecfisa

Gracias por su atención hoy fin de año, ya revise todo lo que el foro ha sacado sobre StringGrid, pero uno de los casos que más me ayuda, se habla del assign() pero no pasan codigo de ejemplo, por de sgracia, no tengo ayuda el mi builder y solo cuento con la ayuda que me puedan dar
Yo cargo información en dos StringGrid, la cual debo agrupar en un tercero
De cierta forma estoy tratando de imitar en algo a un programa conocido como WinQSB, pero usando mis propios conceptos del tema.
No se si con esta aclaración y el codigo anterior que subi me puedan ayudar....

Casimiro Notevi
31-12-2017, 20:40:51
http://www.clubdelphi.com/images/UtilizarTAGs.png

jlalonso1950
31-12-2017, 22:12:20
Agradecido Casimiro pero no entiendo lo que quieres explicarme. Mi problema es sencililo, yo entro por teclado una información en dos stringgrid y después, necesito agruparla toda en un tercero, con variaciones aritmeticas que no tengo problemas con ellas, recuerdo que existe assign() pero no recuerdo el como utilizarla,he tratado de hacerlo por un for y tampoco me da bateo, como decimos aca en Cuba

Casimiro Notevi
31-12-2017, 22:20:45
Hola, solamente te informaba de que uses las etiquetas de código cuando pongas código fuente aquí, para que se pueda leer mejor.

En cuanto a tu problema con los stringgrid, exactamente qué problema tienes, ¿algún error? ¿no traspasa los datos?

jlalonso1950
31-12-2017, 22:25:20
Yo pdoy entrada a dos StringGrid por teclado a la información a utilizar en un cálculo determinado,cuando voy a pasar esa información a la rejilla donde lo voy a trabajar y pongo, por ejemplo StringGrid3->assign(StringGrid1), se detiene el proceso en esa l'inea de codigo

¿Cómo pasar información desde una rejilla a otra?

Casimiro Notevi
31-12-2017, 23:10:39
... pongo, por ejemplo StringGrid3->assign(StringGrid1), se detiene el proceso en esa l'inea de codigo
¿Qué significa que "se detiene el proceso en esa línea de código"?
¿Algún mensaje de error?

jlalonso1950
01-01-2018, 01:24:06
la respuesta del sistema es:

Project Project1.exe raised exception class EConvert with menssage "Can not assign a StringGrid to StringGrid"

jlalonso1950
01-01-2018, 01:33:53
Trate de innovar y pegue las siguientes líneas de código:


for(i=1;i<=StrToInt(Edit2->Text);i++){
StringGrid3->Assign(StringGrid1->Cells[i][1]);
}


al compilar da el siguiente error

[C++ Error] Unit1.cpp(98): E2034 Cannot convert 'AnsiString' to 'TPersistent *'
[C++ Error] Unit1.cpp(98): E2342 Type mismatch in parameter 'Source' (wanted 'TPersistent *', got 'AnsiString')

jlalonso1950
01-01-2018, 15:02:50
Buenos dias y Felicidades.
He buscado en el libro de Chapman y sigo barado, más bien encallado en un banco de dudas....

Casimiro Notevi
01-01-2018, 16:29:22
En delphi es más o menos así:
procedure ...
var
NewStringGrid: TStringGrid;
begin
NewStringGrid := TStringGrid.Create(Self);
try
NewStringGrid.Assign(OldStringGrid);
...
finally
NewStringGrid.Free;
end;
end;

jlalonso1950
01-01-2018, 16:45:48
Implementando tiu sugerencia Casimiro tengo:


for(i=1;i<=StrToInt(Edit2->Text);i++){
StringGrid3->Cells[i][0]=Assign(StringGrid1->Cells[i][0]);
}


y el error que me da es:


[C++ Error] Unit1.cpp(98): E2034 Cannot convert 'AnsiString' to 'TPersistent *'
[C++ Error] Unit1.cpp(98): E2342 Type mismatch in parameter 'Source' (wanted 'TPersistent *', got 'AnsiString')
[C++ Error] Unit1.cpp(98): E2109 Not an allowed type

Casimiro Notevi
01-01-2018, 16:55:45
Es que no tiene nada que ver tu código con el ejemplo que he puesto.
En mi ejemplo estás asignando un stringgrid a otro stringgrid.
En tu código estás intentando asignar celdas, mediante un bucle.
En tu caso no hay que usar assign.

Será más o menos así:
for (i=1;i<=columnamayor;i++)
stringgrid3->cells[i][0]=stringgrid1->cells[i][0];

jlalonso1950
01-01-2018, 17:25:21
for (i=1;i <=StrToInt(Edit2->Text);i++){
StringGrid3->Cells[i][0]=StringGrid1->Cells[i][0];
}


No da error, pero no carga el 3 con la información del 1

Le voy a pasar un correo desde mi correo personal, con las pantallas, que hacen y a ver si asi me puede ayudar mejor

ecfisa
01-01-2018, 18:01:08
Hola.

Suponiendo que las dimensiones de los StringGrids son iguales, si deseas copiar el contenido de uno a otro:

void copySG(TStringGrid *source, TStringGrid *target)
{
for(int r = source->FixedRows; r < source->RowCount; r++)
target->Rows[r]->AddStrings(source->Rows[r]);
}

// Ejemplo de uso:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
copySG(StringGrid1, StringGrid3);
}


Si deseas sumar dos TStringGrid y dejar el resultado en un tercero:

void sumarSG(TStringGrid *s1, TStringGrid *s2, TStringGrid *s3)
{
// (se supone que s1 y s2 contienen datos numéricos válidos)
for(int r = s1->FixedRows; r < s1->RowCount; r++)
for(int c = s1->FixedCols; c < s1->ColCount; c++)
s3->Cells[c][r] = s1->Cells[c][r].ToDouble() + s2->Cells[c][r].ToDouble();
}

// Ejemplo de uso:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
sumarSG(StringGrid1, StringGrid2, StringGrid3);
}

Son ejemplos orientativos, todo depende de lo que desees hacer y como tengas distribuida la información en los StringGrids...

Saludos :)

Casimiro Notevi
01-01-2018, 18:48:05
Le voy a pasar un correo desde mi correo personal, con las pantallas, que hacen y a ver si asi me puede ayudar mejor
Nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), punto 14.

jlalonso1950
02-01-2018, 17:18:34
disculpas por mis metidas de pie..... pero con lo último que me dijo Casimiro, me puse a pensar y el StringGrid, no es más que un arreglo bidimensional, por lo que lleve a cabo el uso de esto, por lo que ocasionalmente llegue a lo que me recomendo después Ecfisa, Gracias, me sacaron de un buen agujero negro, ya puedo presentar mi clase con un inicio bien fundamentado

jlalonso1950
06-01-2018, 00:48:38
Hoy me trae un nuevo problema, al cual no he encontrado respuesta navegando por la página, y es como puedo comparar dos celdas de un mismo StringGrid.He tratado de usar ->Value= pero no me:( da resultados algunos
HELP

ecfisa
06-01-2018, 01:49:18
Hola.

Un ejemplo:

...
if (StringGrid1.Cells[0,0] = StringGrid1.Cells[1,0]) and
not(StringGrid1.Cells[0,0] <> StringGrid1.Cells[2,0]) then
ShowMessage('Las celdas [0,0], [1,0] y [2,0] tienen igual contenido');
...


Saludos :)

arturoio
09-01-2018, 01:54:33
Si no me equivoco para rescatar el valor de una celda bastaría con esto

variable = stringGrid->Cells[1][1]