1

Delphi v7

私は本当のプログラマーではないと言って、私の改善の質問の前に述べさせてください。私は副保安官であり、私たちがしていることを行うのを助けるために時折プロジェクトを書いています。

私の現在のプロジェクトには、いくつかのTDBRichEditコントロールが含まれています。ツールバーボタンにさまざまなフォーマットプロセスを割り当てました。ComboBoxを使用してRichEditフォントを変更できるようにしたいと思います。コンボボックスにはフォントリストが表示されますが、TDBRichEditコントロールのフォントには影響しません。私はこれを1週間以上理解しようとしてきましたが、問題がわかりません。

これは私がしたことです:

フォームOnCreateプロシージャ

procedure TForm1.FormCreate(Sender: TObject);
begin
PageControl1.ActivePage:= TabSheet1;
  GetFontNames;
  SelectionChange(Self);
  CurrText.Name := DefFontData.Name;
  CurrText.Size := -MulDiv(DefFontData.Height, 72, Screen.PixelsPerInch);
  end;

フォーム選択の変更

procedure TForm1.SelectionChange(Sender: TObject);
begin
  if ActiveControl is TDBRichEdit then
    with ActiveControl as
    TdbRichEdit do  begin
  try
    Ctrlupdating := True;

    Size.Text := IntToStr(SelAttributes.Size);
    cmbFont.Text := SelAttributes.Name; 
finally
    Ctrlupdating := False;
  end;
end;
end;

関数(「ActiveControlの部分を除いて、これらは私の関数ではなく、完全に理解するのに十分な知識がありません。)

Function TForm1.CurrText: TTextAttributes;
begin
if ActiveControl is TDBRichEdit then
    with ActiveControl as
    TdbRichEdit do  begin
  if SelLength > 0 then Result := SelAttributes
  else Result := DefAttributes;
end;
end;

function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
  FontType: Integer; Data: Pointer): Integer; stdcall;
begin
  TStrings(Data).Add(LogFont.lfFaceName);
  Result := 1;
end;

コンボボックスのOnDrawイベント

procedure TForm1.cmbFontDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
 begin
 with (Control as TComboBox).Canvas do
  begin
    Font.Name := Screen.Fonts.Strings[Index];
    FillRect(Rect) ;
    TextOut(Rect.Left, Rect.Top, PChar(Screen.Fonts.Strings[Index]));

  end;
  end;

コンボボックスのOnChangeイベント

procedure TForm1.cmbFontChange(Sender: TObject);
begin
if Ctrlupdating then Exit;
  CurrText.Name := cmbFont.Items[cmbFont.ItemIndex];
end;

何か案は?

4

2 に答える 2

2

コードで、次のコードのテキスト属性を変更しようとします。

procedure TForm1.cmbFontChange(Sender: TObject); 
begin 
  if Ctrlupdating then Exit;
  CurrText.Name := cmbFont.Items[cmbFont.ItemIndex];
end;

このコードを実行すると、ActiveControlはcmbFontになります。次に、CurrTextを見てください。

if ActiveControl is TDBRichEdit then
  with ActiveControl as TdbRichEdit do 
  begin
    if SelLength > 0 then
      Result := SelAttributes
    else 
      Result := DefAttributes;
  end;

したがって、最初のifブロックは入力されません。

実際、この場合、関数はResultに何も割り当てていないように見えます。常に結果に割り当てる必要があります。警告とヒントを有効にすると、コンパイラはこれを通知します。

ActiveControlを使用する代わりに、リッチエディットインスタンスを直接指定する必要があります。フォームがどのように配置されているかはわかりませんが、変更を適用するリッチエディットコントロールを決定するには、他の手段を使用する必要があります。おそらく、ページコントロールのアクティブなページに基づいています。

于 2013-01-09T07:44:01.163 に答える
0
于 2013-01-09T23:24:00.427 に答える