1、我在一个窗体Image中显示图片,代码为:
procedure TForm3.Button3Click(Sender: TObject);begin
  if OpenPictureDialog1.Execute then
  Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
这样图片在Image中的显示没有问题,并且我将Image存入到数据库图片字段代码为:
Unit3.DataModule3.ADOTable1.FieldByName('Userphoto').Assign(Image1.Picture.Graphic);
但在另一个窗体的DBImage中我要显示存放在数据库的图片,DATAFIELD设置成数据库图片字段后,编译能通过,但一运行后仍有提示*.EXE raised exception class EInvalidGraphic with message 'bitmap image is not valid'.(说明一下,数据库图片字段有空数据)
2、如何在关闭非主窗体时,同时关闭主窗体,结束应用程序??我用的是
procedure TForm2.FormClose(Sender: TObject);
begin
Application.Terminate;
end;
3、如何让非主窗体在程序运行时先于主窗体显示。请问代码如何编写或者属性如何设置。
请各位高手不吝赐教,真的很急!!!!

解决方案 »

  1.   

    1.暂无
    2.sendmessage 一个ws_close消息给主窗体可行吗?个人让为那么内存释放的好些
    3.改写Project单元,在application.Initialize后先show非主窗体
      

  2.   

    1. uses jpeg;
    procedure TFrmEmployee.spbAddPhotoClick(Sender: TObject);
    var
      lExtName: string;
      lJpegImage: TJpegImage;
    begin
      inherited;
      // Save  將數據庫的圖片保存為文件
      if Sender = spbSavePhoto then
        if SavePictureDialog.Execute then
        begin
          lExtName := ExtractFileExt(SavePictureDialog.FileName);
          if (UpperCase(lExtName) = '.JPG')
            or (UpperCase(lExtName) = '.JEPG') then
          begin
            lJpegImage := TJpegImage.Create;
            try
              lJpegImage.Assign(dbimgPhoto.Picture.Graphic);
              lJpegImage.SaveToFile(SavePictureDialog.FileName);
            finally
              lJpegImage.Free;
            end; // end try
          end else
            TBlobField(adodstMas.FieldByName('Photo')).SaveToFile(SavePictureDialog.FileName);
        end;  if not (adodstMas.State in [dsEdit, dsInsert]) then exit;
      // Add 將文件保存到數據庫
      if Sender = spbAddPhoto then
        if OpenPictureDialog.Execute then
        begin
          lExtName := ExtractFileExt(OpenPictureDialog.FileName);
          if (UpperCase(lExtName) = '.JPG')
            or (UpperCase(lExtName) = '.JEPG') then
          begin
            lJpegImage := TJpegImage.Create;
            try
              lJpegImage.LoadFromFile(OpenPictureDialog.FileName);
              dbimgPhoto.Picture.Graphic.Assign(lJpegImage);
            finally
              lJpegImage.Free;
            end; // end try
          end else
            TBlobField(adodstMas.FieldByName('Photo')).LoadFromFile(OpenPictureDialog.FileName);
        end; // end if OpenPictureDialog.Execute then  // Clear 刪除數據庫中保存的圖片
      if Sender = spbClearPhoto then
        adodstMas.FieldByName('Photo').AsVariant := Null;
    end;2. 
    先用 
      for i := 0 to Application.MainForm.MDIChildCount - 1 do
      begin
          Application.MainForm.MDIChildren[i].Close;
      end
      Application.MainForm.Close;3.
    Project文件中    if TFrmLogin.Execute = 1 then // 創建登錄窗體
        begin
          Application.CreateForm(TFrmMain, FrmMain);// 創建主窗體
          Application.BringToFront;
        end;
      

  3.   

    楼上,第一个问题:我是想在一个窗体Image中显示图片,用Openpicturedialog,点保存的话将Image中的图片写入到数据库中;同时我想让图片在另一个窗体的DBImage中显示,请问如何实现呢,
    第三个问题,我的主窗体和登录窗体已经创建完成,但运行后我想让登录窗体先显示,我如何填加代码呢?
      

  4.   

    我是初学者,我的软件已到收尾关键阶段,眼下又在西安出差,无人可求助,望您不吝赐教,如有机会定当当面致谢,我的QQ382997553,如果您不介意,加我在QQ里向您请教!
      

  5.   

    if image1.picture.Graphic <> nil then  //避免image1中无图像保存出错
        begin
          // ext:=extractfileext(openpicturedialog1.FileName );
           strm := tmemorystream.Create ;
           try
           image1.Picture.Graphic.SaveToStream(strm);
           strm.Position :=0;
           tblobfield(dataMod.ADOQry_stu.FieldByName('photo')).LoadFromStream(strm);
           finally
                 strm.Free; //如果你选用TBLOBSTREAM类,程序运行到此语句会出错,可该语句前添入adotable1.edit
           end;
        end;
      try    //try1
        strm := tadoblobstream.Create(tblobfield(dataMod.ADOQry_detail.fieldbyname('photo')),bmread);
        strm.position :=0;
       // image1.Picture.Graphic := nil;
        jpegimage := tjpegimage.Create ;
        jpegimage.LoadFromStream(strm);
        image1.Picture.Graphic := jpegimage;
        jpegimage.Free ;
        strm.Free ;
        except
           ;
        end;
      

  6.   

    楼上能写详细点吗?另外我想让数据库图片如何在DBImage中显示如何做呀?
      

  7.   

    帮你顶!!!
    特别是操作ORACLE数据库时问题特别多
      

  8.   

    楼上的朋友,图片不能在dbimage中显示,是因为你用Openpicturedialog打开的图片保存到数据库,和DBimage中显示的图片格式不一致,DBimage中显示的是BMP格式的,所以你保存时要转换格式,其实最好用流的形式写。
    但运行后我想让登录窗体先显示你可以在工程资源文件中把登录窗体在主窗体前建立,你也可以在主窗体体SHOW时显示登录窗体
      

  9.   

    楼上的,如果是操作ORACLE的话,那问题就老多,不只是DBIMAGE的问题,用IMAGE也不中
      

  10.   

    将dpr文件的创建主窗体的代码删掉,加入创建子窗体的代码:begin
      Application.Initialize;
      SubForm := TSubForm.Create(nil);
      try
        if SubFrom.ShowModal = mrOk then
        begin
          MainForm := TMainForm.Create(nil);
          try
            MainForm.Show;
          finally
            MainForm.Free;
          end;
        end;
      finally
        SubFrom.Free; 
      end;
      

  11.   

    Lwg0901(伤心人) 应该可以了
    如果dbimage不能正常显示,那就换image拉,在adouqery的afterScroll事件里就行呀
      

  12.   

    1)建议使用DBEXPRESS,因为ADO操作blob类型的有很多问题,而DBEXPRESS则没有任何问题
      如果没有要求一定用ADO的话,那换个方式,更简单!!!
    2),3)应该不难吧,好像没有现成的,自己写个语句控制一下就成了