Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cargar imágenes en celdas de StringGrid dependiendo de una consulta en tiempo de eje (https://www.clubdelphi.com/foros/showthread.php?t=62221)

gulder 11-12-2008 17:02:29

Cargar imágenes en celdas de StringGrid dependiendo de una consulta en tiempo de eje
 
Hola foro como andan espero que bien, con el siguiente codigo cargo imagenes en las celdas de un StringGrid

Código Delphi [-]
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Ancho,Posicion: Integer;
begin
  Ancho := StringGrid1.ColWidths[2] div 2;
  Posicion := Ancho - (Image1.Picture.Width div 2);
  if (ARow = 3) and (ACol = 2) then
    with StringGrid1.Canvas do
      Draw(Rect.Left+Posicion, Rect.Top, Image1.Picture.Graphic);
end;

Este codigo lo hace bien el problema es que con este código las cargo cuando se ejecuta mi aplicación, y yo quiero cambiar dichas imágenes dependiendo una consulta que hago a una base de datos, pero no se como llamar dicho evento para que cargue mis imágenes cuando realizo la consulta, la consulta ya esta bien lo que quiero que me digan es como rellenar las celdas del StringGrid desde la consulta con las imagenes saludos gulder-gan

egostar 11-12-2008 17:17:37

Hola,

Algo sencillo....

Código Delphi [-]
function MaidSt(datoabuscar:string):integer;
begin
  //Consulta X que regresa un entero, por ejemplo
end;

begin
  Case MaidSt(StringGrid1.Cells[0,ARow]) of
     3 : StringGrid1.Canvas.Draw(Rect.Left+34, Rect.Top, Image2.Picture.Graphic);
     4 : StringGrid1.Canvas.Draw(Rect.Left+34, Rect.Top, Image3.Picture.Graphic);
     5 : StringGrid1.Canvas.Draw(Rect.Left+34, Rect.Top, Image1.Picture.Graphic);
  end;
end;

Salud OS

gulder 11-12-2008 17:33:19

Hola egostar gracias por responder, bueno la forma en que me colocas tu respuesta no la entendi muy bien por eso te coloco mi consulta, quiero que sepas que cuando yo hago la consulta la imagen que traigo la guardo al disoc y la cargo en un Timage y despues de este Timage la trato de cargar a las celdas que corresponde aqui esta mi consulta

Código Delphi [-]
procedure TForm1.CargarImagenesLink();
var
id:string;
i:integer;
LmsImagen: TADOBlobStream;
Rect: TRect;
State: TGridDrawState;
ancho,Posicion: Integer;
begin
//
      with form1.ADOQuery2 do
      begin

        //hallamos el id del tema al cual le bamos a cargar la imagenes
       Active:=false;
       sql.Text:= 'select id from Post'+
                  ' where Titulo ='+char(39)+Trim(NextGrid1.Cells[1,Grow])+char(39);
       Active := true;
       id := Fields.Fields[0].AsString;

       //traemos el link y las imagens del tema seleccionado
       Active:=false;
       sql.Text:= 'SELECT  temas_posteados.link,Foros.imagen  from  temas_posteados, foros'+
                  ' where temas_posteados.id_foros = Foros.id_foros and  temas_posteados.id ='+id;
       Active := true;

       ListBox1.Clear;

             for  i:=0  to recordcount-1 do
             begin
              //aqui cargho el link del tema en un litbox
              ListBox1.Items.Add(Fields.Fields[0].AsString);

              //aqui si la imagen que garco no es null entro
                     If Not Fields.Fields[1].IsNull Then
                       Begin

                         //la imagen que cargo la guardo en el disco y la cargo en un Image Que esta en el form
                         LmsImagen := TADOBlobStream.Create(TBlobField(Fields.Fields[1]),bmRead);
                         LmsImagen.SaveToFile(ExtractFilePath(Application.ExeName)+'foto.jpg');
                         Image1.Picture.Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName)+'foto.JPG');

                         Ancho := StringGrid1.ColWidths[2] div 2;
                         Posicion := Ancho - (Image1.Picture.Width div 2);

                         //aqui debo cargar la imagen que esta en el Timage y mostrarla
                         //en laselda 

                       end;
              next;
             end;
     end;

end;

espero que mi codigo se entienda saludos gulder gan

Caro 11-12-2008 18:13:53

Cita:

Empezado por egostar (Mensaje 330515)
Hola,

Algo sencillo....

Código Delphi [-]
function MaidSt(datoabuscar:string):integer;
begin
//Consulta X que regresa un entero, por ejemplo
end;

begin
Case MaidSt(StringGrid1.Cells[0,ARow]) of
3 : StringGrid1.Canvas.Draw(Rect.Left+34, Rect.Top, Image2.Picture.Graphic);
4 : StringGrid1.Canvas.Draw(Rect.Left+34, Rect.Top, Image3.Picture.Graphic);
5 : StringGrid1.Canvas.Draw(Rect.Left+34, Rect.Top, Image1.Picture.Graphic);
end;
end;

Lo que pasa amiguito es que el parametro Rect lo tiene en el evento OnDrawCell y el quiere colocar la imagen despues de hacer su consulta osea que no se estaría en el evento OnDrawCell.

Para hacer lo que pide lo que se me ocurre es obtener el TRect de la celda donde se quiere colocar la imagen, teniendo eso ya podemos dibujar la imagen dentro de esa celda.

En este ejemplo se coloca la imagen dentro de la fila y columna 2, tu debes adecuar a tu codigo.

Código Delphi [-]
var
 Rec : TRect;
begin
 Rec :=StringGrid1.CellRect(2,2);
 StringGrid1.Canvas.Draw(Rec.Left+34, Rec.Top, Image1.Picture.Graphic);

Saluditos

egostar 11-12-2008 18:21:56

Cita:

Empezado por Caro (Mensaje 330526)
Lo que pasa amiguito es que el parametro Rect lo tiene en el evento OnDrawCell y el quiere colocar la imagen despues de hacer su consulta osea que no se estaría en el evento OnDrawCell.

Asi es amiguita, no coloque el nombre del evento OnDrawCell porque asumí que estabamos en ese evento, el "pintado" de las imagenes se hace en ese evento, aqui te muestro lo que yo hago.....

Código Delphi [-]
//Consulto es status de una habitación.
function TFcalendar.MaidSt(Habitacion:String):Integer;
begin
  With DataModule1.QMaidStatus do begin
    SQL.Text := 'SELECT STATUS FROM MAIDSTATUS WHERE HABITACION = "'+Habitacion+'"';
    Open;
    Result := fields[0].AsInteger;
    Close;
 end;
end;

//Asigno la imagen que le corresponde a la fila en base al status de la habitación
procedure TFcalendar.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  with Sender as TStringGrid do begin
    if (ACol=0) then begin
      Case MaidSt(StringGrid1.Cells[0,ARow]) of
         3 : StringGrid1.Canvas.Draw(Rect.Left+34, Rect.Top, Image2.Picture.Graphic);
         4 : StringGrid1.Canvas.Draw(Rect.Left+34, Rect.Top, Image3.Picture.Graphic);
         5 : StringGrid1.Canvas.Draw(Rect.Left+34, Rect.Top, Image1.Picture.Graphic);
      end;
    end;
  end;
end;

Salud ITOS

gulder 11-12-2008 19:50:29

Caro y egostar gracias por responder con la respuesta que me dio cara logre cargar las imagenes en las celdas del StringGrid el problema que tengo ahora es que si doi clic en una de las imagenes que se
encuentra en la celdas del StringGrid esta se borra y de igual manera si dimenciono el StringGrid el cual yo le doi la opcion al usuario de redimencionar se borra todas y no se por que espero alguna ayuda saluditos

egostar 11-12-2008 19:53:39

Hola

Eso es porque lo estas haciendo fuera del evento OnDrawCell, amigo gulder

Salud OS

gulder 11-12-2008 20:25:36

hola egostar yo de new por aqui bueno como veo que lo de caro no me resulta le estoy tirando cabeza un poco a tu codigo entonces quiero que me expliques que en caso de que el estado de alguna habitacion cambiara como haces para llamar a dicho evento para que repinte las imagenes saluditos y discupa por tanta molestadera

egostar 11-12-2008 20:58:45

Cita:

Empezado por gulder (Mensaje 330549)
hola egostar yo de new por aqui bueno como veo que lo de caro no me resulta le estoy tirando cabeza un poco a tu codigo entonces quiero que me expliques que en caso de que el estado de alguna habitacion cambiara como haces para llamar a dicho evento para que repinte las imagenes saluditos y discupa por tanta molestadera

Hola

el "repintado" de las celdas se hace cuando realizas un cambio en el StringGrid, en mi caso lo que hago es modificar las casillas del StringGrid con algunos datos y automáticamente ejecuta el evento OnDrawCell, depende que es lo que estes haciendo.

Salud OS


La franja horaria es GMT +2. Ahora son las 06:12:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi