掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
FMXでStringGridの行や列毎に色を変える、Modalウィンドゥを閉じる (ID:48616)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
間が空いてしまいましたが、yTakeです。 少々長いです。 1) 一応、行・列毎の背景色の設定は、ある程度実現出来ました。 ただ、行の色分けにAlternatingRowBackgroundを”True”としましたが、その色が分かりません。 ”FMX.Grid.Style”にalternatingBackgroundColorと言う変数がある様ですが、uses節で”FMX.Grid.Style”を読んでいますが、未定義の識別子になってしまいます。 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv DefaultDrawing=False AlternatiingRowBackground=True を設定しいます。 procedure TForm1.StringGrid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); var i, j : Word; str : String; begin j := Row; i := column.Index ; str := Value.ToString; if ( i mod 5 ) = 0 then begin Canvas.Fill.Color := claLightGray; Canvas.FillRect( Bounds, 0, 0, AllCorners, 1, TCornerType.Round ); CAnvas.Fill.Color := claBlack; Canvas.FillText( Bounds, str, False, 100, [TFillTextFlag.RightToLeft], TTextAlign.Center, TTextAlign.Center ); end else begin Canvas.Fill.Color := Canvas.Fill.DefaultColor; Canvas.FillRect( Bounds, 0, 0, AllCorners, 1, TCornerType.Round ); CAnvas.Fill.Color := claBlack; Canvas.FillText( Bounds, str, False, 100, [TFillTextFlag.RightToLeft], TTextAlign.Center, TTextAlign.Center ); end; end; としました。 StringGridに書き込むところでは、 for i := 0 to col2 do begin StringColumn_1[ i ] := TStringColumn.Create( Form1.StringGrid1 ); StringColumn_1[ i ].Width := 60; StringColumn_1[ i ].Header := IntToStr( i ); Form1.StringGrid1.AddObject( StringColumn_1[ i ] ); if i = 0 then begin StringColumn_1[ i ].Locked := True; for j := 0 to dcm_Data_1.row2 - 1 do Form1.StringGrid1.Cells[ i, j ] := FloatToStrF( j + 1, ffFixed, 5, 0 ); end else begin // StringColumn_1[ i ].Align := TTextAlign.Center; ① for j := 0 to row2 - 1 do begin // Form1.StringGrid1.Columns[ i ].Align := taCenter; ② Form1.StringGrid1.Cells[ i, j ] := FloatToStrF( MTX2.MTX[ i - 1, j ].dens, ffFixed, 5, 0 ); end; end; end; としています。 問題は、背景色の着いたセルにテキストをセンター寄りにして書き直すところです。 つまり、背景色を塗り直してその後元の文字列を描画していますが、AlternatingBackgroundColorが何色か分からない為、背景色の塗り直しが出来ていません。 AlternatingBackgroundColorの色を知るにはどの様にするのでしょう? 或いは、予めセンター寄りにしてから、StringGridへ書き込めば良い様にも考えましたが、アライメントが出来ません。 TAlignLayoutとTTextAlignには互換性がありません。或いはTAlignLayoutとTAlignmentには互換性がありませんとなります。(①と②) 2) また、処理に時間が掛かる為、ModalウィンドウにProgressBarを表示して、進捗が分かる様にする件では、処理終了後Modalウィンドゥを閉じる事が出来ない為、Modalウィンドゥは諦めて、単に別ウィンドウにProgressBarを表示する事で実現しました。 VCLでは”PostMessage”を利用してModalを閉じられる様ですが、FMXでは難しい様です。 3) 一方で、ビットマップの表示が出来なくなりました。 経緯: 先にDelphi XE6作成したBitmapの描画に問題のないプロジェクトをXE10.1 Berlinに読み込んで実行した場合、ほぼ問題なく(少なくとも自分で描画した画像は)XE10.1 Berlinでも描画できています。 ただ、色々試行錯誤の後、エラー”例外クラスEReadError(メッセージ’プロパティFormFactor.Widthが存在しません’)を送出しました”が出る様になってしまい。これが解消できない為、 新たにXE10.1 Berlinで同様のBitmapルーチンを作成しましたが、Bitmapが描画されません。 経緯ここまで。 Bitmapデータを作成するところと作成したBitmapをImageへ描画するところは同じ様にコーディングしているはずですが、、、 Bitmapの作成、 procedure draw_bitmap( var bmp0 : TBitMap ; row0, col0 : Word ; var MTX0 : RRMTX ); var i, j : Word; offsetX : Word; offsetY : Word; vBitMapData : TBitmapData; vPixelColor : TAlphaColor; tmpColor : TAlphaColor; clr : Byte; begin if row0 > col0 then begin bmp0.SetSize( row0, row0 ); offsetX := ( row0 - col0 ) div 2; offsetY := 0; end else begin bmp0.SetSize( col0, col0 ); offsetX := 0; offsetY := ( col0 - row0 ) div 2; end; bmp0.Map( TMapAccess.Write, vBitMapData ); for j := 0 to row0 - 1 do begin for i := 0 to col0 - 1 do begin clr := 255 - MTX0.MTX[ i, j ].disp; vPixelColor := ( clr shl 0 ) + ( clr shl 8 ) + ( clr shl 16 ) + 4278190080; vBitMapData.SetPixel( offsetX + i, offsetY + j, vPixelColor ); // tmpColor := vBitMapData.GetPixel( offsetX + i, offsetY + j ); end; end; bmp0.Unmap( vBitMapData ); end; Imageへの描画 srcRect.Top := 0 ; srcRect.Left := 0 ; srcRect.Right := bmp2.Width ; srcRect.Bottom := bmp2.Height ; dstRect.Top := 0 ; dstRect.Left := 0 ; dstRect.Right := Form1.Image1.Width; dstRect.Bottom := Form1.Image1.Height; Form1.Image1.Bitmap.Canvas.BeginScene(); Form1.Image1.Bitmap.Canvas.DrawBitmap( bmp2, srcRect, dstRect, 1.0, False ); Form1.Image1.Bitmap.Canvas.EndScene(); Form1.Image1.EndUpdate(); です。 Bitmapデータは任意の矩形ですが、描画すべきImageは正方形である為、その中央に描画される様にBitmapにオフセットをを持たせています。 それをCanvas.DrawBitmapで描画させているだけなのですが、なぜか描画されません。 違いはと言えばXE6でのFMXは”デスクトップアプリケーション”を選択しましたが、XE10.1でFMXで”デスクトップアプリケーション”の選択がなく、”マルチデバイスアプリケーション”で”空のアプリケーション”を選択しました。 が、特に問題ではない様に思えます。 質問が取り留めなくなってしまいました。何か、アドバイスがあればお願い致します。 当方、 64bitWindows10Pro DELPHI XE10.1 Berlin (Starter)
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.