gpt4 book ai didi

delphi - 如何在 TMemo 中突出显示一行?

转载 作者:行者123 更新时间:2023-12-02 07:40:42 24 4
gpt4 key购买 nike

我想在 TMemo 控件中突出显示包含插入符号的行,类似于 Delphi IDE 中的编辑器。我尝试了下面的代码,它确实有效:(对 With 语句感到抱歉,这需要重构。)

procedure TMemo.WMPaint(var Message: TWMPaint);
var
PS: TPaintStruct;
DC: Hdc;
Canvas: TCanvas;
LineIdx: Integer;
X, Y: Integer;
Max: Integer;
s: string;
h: Integer;
begin
DC := Message.DC;
if DC = 0 then
DC := BeginPaint(Handle, PS);
Canvas := TCanvas.Create;
try
Canvas.Handle := DC;
Canvas.Font.Name := Font.Name;
Canvas.Font.Size := Font.Size;
with Canvas do begin
Max := TopLine + VisibleLines;
if Max > Pred(Lines.Count) then
Max := Pred(Lines.Count);

Brush.Color := Self.Color;
FillRect(Self.ClientRect);

Brush.Color := clYellow;
h := Canvas.TextHeight('Mg');
Y := (Line - TopLine) * h;
Marker.Top := y + self.Top;
FillRect(Rect(0, Y, ClientRect.Right, Y + h));
Brush.Color := Self.Color;

Y := 1;
for LineIdx := TopLine to Max do begin
X := 2;
s := Lines[LineIdx];
if LineIdx = Line then
Brush.Color := clYellow
else
Brush.Color := Self.Color;
TextOut(X, Y, s);
Inc(Y, h);
end;
end;
finally
if Message.DC = 0 then
EndPaint(Handle, PS);
end;
Canvas.Free;
inherited;
end;

(此代码通过插入器类添加到备忘录中。)

这可行,但触发频率不够。例如。当我使用向下箭头滚动时。

当然,我现在可以开始添加各种事件,以便调用备忘录的 invalidate 方法,从而强制重新绘制,但这似乎不对。也许已经有这样的组件,我可以使用?我已经从 Jvcl 检查了 TJvMemo,它似乎没有这样的功能。

编辑:我最终使用了 SynEdit。

最佳答案

TMemo 本身并不支持该功能,尝试添加该功能将导致无穷无尽的麻烦。

相反,请考虑使用不同的文本编辑控件。这就是 Delphi IDE 的作用。 SynEdit例如,支持以下功能:将 ActiveLineColor 属性设置为 clNone 以外的其他值。

关于delphi - 如何在 TMemo 中突出显示一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24553528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com