mweditstrings.pas
来自「本人买的<<VC++项目开发实例>>源代码配套光盘.」· PAS 代码 · 共 749 行 · 第 1/2 页
PAS
749 行
procedure TmwEditItemList.MultiDelete(Index, Number: Integer);
begin
Dec(FCount, Number);
if Index < FCount then
System.Move(fList[Index + Number], fList[Index],
(FCount - Index) * SizeOf(PmwEditItem));
end;
procedure TmwEditItemList.PrepareMultiInsert(Index, Number: Integer);
begin
if FCount + Number >= FCapacity then SetCapacity(Count + Number + 256);
if Index < FCount then
System.Move(fList[Index], fList[Index + Number],
(FCount - Index) * SizeOf(PmwEditItem));
Inc(FCount, Number);
end;
{$R+}
{ TmwEditStrings }
function TmwEditStrings.Add(const S: string): Integer;
begin
BeginUpdate;
Result := fList.Count;
InsertItem(Result, S);
if Assigned(FOnAdded) then FOnAdded(Self);
EndUpdate;
end;
procedure TmwEditStrings.BeginUpdate;
begin
if FUpdateCount = 0 then SetUpdateState(True);
Inc(FUpdateCount);
end;
procedure TmwEditStrings.Changed;
begin
if (FUpdateCount = 0) and Assigned(FOnChange) then FOnChange(Self);
end;
procedure TmwEditStrings.Changing;
begin
if (FUpdateCount = 0) and Assigned(FOnChanging) then FOnChanging(Self);
end;
procedure TmwEditStrings.Clear;
var
I, Last: Integer;
begin
BeginUpdate;
Last := fList.Count - 1;
for I := 0 to Last do
if Assigned(fList[I]) then Dispose(fList[I]);
fList.Clear;
EndUpDate;
end;
constructor TmwEditStrings.Create;
begin
FList := TmwEditItemList.Create;
inherited Create;
fHandle := AllocateHwnd(WndProc);
end;
procedure TmwEditStrings.Delete(Index: Integer);
begin
if (Index >= 0) and (Index < fList.Count) then
begin
BeginUpdate;
if assigned(fList[Index]) then Dispose(fList[Index]);
fList.Delete(Index);
if Assigned(FOnDeleted) then fOnDeleted(Index);
EndUpdate;
end;
end;
procedure TmwEditStrings.DeleteBetween(Index1, Pos1, Index2,
Pos2: Integer);
var
TempStr1, TempStr2: String;
StringLen: Integer;
begin
if (Index1 >= 0) and (Index1 <= Index2) and (Index2 < fList.Count) then
begin
BeginUpdate;
StringLen := Length(fList[Index1].fString);
if Pos1 <= StringLen + 1 then
TempStr1 := Copy(fList[Index1].fString, 1, Pos1 - 1) else
TempStr2 := fList[Index1].fString + StringOfChar(' ', Pos1 - StringLen - 1);
StringLen := Length(fList[Index2].fString);
TempStr2 := Copy(fList[Index2].fString, Pos2, StringLen);
fList[Index1].fString := TempStr1 + TempStr2;
TempStr1 := '';
TempStr2 := '';
if Index1 < Index2 then MultiDelete(Index1 + 1, Index2 - Index1 - 1);
EndUpdate;
end;
end;
destructor TmwEditStrings.Destroy;
begin
Clear;
FList.Free;
DeallocateHWnd(fHandle);
inherited Destroy;
end;
procedure TmwEditStrings.EndUpdate;
begin
Dec(FUpdateCount);
if FUpdateCount = 0 then SetUpdateState(False);
end;
procedure TmwEditStrings.Exchange(Index1, Index2: Integer);
var
Temp: PmwEditItem;
begin
if (Index1 < 0) or (Index1 >= Count) then exit;
if (Index2 < 0) or (Index2 >= Count) then exit;
BeginUpdate;
Temp := FList[Index1];
fList[Index1] := FList[Index2];
fList[Index2] := Temp;
EndUpdate;
end;
function TmwEditStrings.Get(Index: Integer): string;
begin
if (Index < 0) or (Index >= fList.Count) then Result := '' else
Result := FList[Index].FString;
end;
function TmwEditStrings.GetCapacity: Integer;
begin
Result := fList.Capacity;
end;
function TmwEditStrings.GetCount: Integer;
begin
Result := fList.Count;
end;
function TmwEditStrings.GetInfo(Index: Integer): TObject;
begin
if (Index < 0) or (Index >= fList.Count) then Result := nil else
Result := FList[Index].FInfo;
end;
function TmwEditStrings.GetObject(Index: Integer): TObject;
begin
if (Index < 0) or (Index >= fList.Count) then Result := nil else
Result := FList[Index].FObject;
end;
procedure TmwEditStrings.Insert(Index: Integer; const S: string);
begin
if (Index >= 0) and (Index <= fList.Count) then
begin
BeginUpdate;
InsertItem(Index, S);
if Assigned(FOnInserted) then fOnInserted(Index);
EndUpdate;
end;
end;
procedure TmwEditStrings.InsertAt(Index, aPos: Integer; S: string);
var
TempStr: String;
StringLen: Integer;
begin
if (Index >= 0) and (Index <= fList.Count) then
begin
if aPos < 1 then aPos := 1;
TempStr := fList[Index].fString;
StringLen := Length(TempStr);
if aPos <= StringLen then
System.Insert(TempStr, S, aPos) else
if aPos = StringLen + 1 then TempStr := TempStr + S else
TempStr := TempStr + StringOfChar(' ', aPos - StringLen - 1) + S;
fList[Index].fString := TempStr;
TempStr := '';
EndUpdate;
end;
end;
procedure TmwEditStrings.InsertItem(Index: Integer; const S: string);
var
NewItem: PmwEditItem;
begin
New(NewItem);
NewItem.Finfo := nil;
NewItem.FObject := nil;
NewItem.FString := S;
fList.Insert(Index, NewItem);
end;
procedure TmwEditStrings.InsertStrings(Index: Integer;
StringsToInsert: TStrings);
var
I, InsertIndex: Integer;
begin
if (Index >= 0) and (Index <= fList.Count) then
begin
BeginUpdate;
fList.PrepareMultiInsert(Index, StringsToInsert.Count);
InsertIndex := Index;
for I := 0 to StringsToInsert.Count - 1 do
begin
PutNewItem(InsertIndex, StringsToInsert[I]);
inc(InsertIndex);
end;
EndUpdate;
end;
end;
procedure TmwEditStrings.InsertStringsBetween(Index1, Pos1, Index2,
Pos2: Integer; StringsToInsert: TStrings);
var
TempStr1, TempStr2: String;
StringLen: Integer;
I, InsertIndex: Integer;
begin
if (Index1 >= 0) and (Index1 <= Index2) and (Index2 < fList.Count) then
begin
BeginUpdate;
StringLen := Length(fList[Index1].fString);
if Pos1 <= StringLen + 1 then
TempStr1 := Copy(fList[Index1].fString, 1, Pos1 - 1) else
TempStr2 := fList[Index1].fString + StringOfChar(' ', Pos1 - StringLen - 1);
StringLen := Length(fList[Index2].fString);
TempStr2 := Copy(fList[Index2].fString, Pos2, StringLen);
if StringsToInsert.Count < 2 then
begin
fList[Index1].fString := TempStr1 + StringsToInsert[0] + TempStr2;
if Index1 < Index2 then MultiDelete(Index1 + 1, Index2 - Index1 - 1);
end else
begin
fList[Index1].fString := TempStr1 + StringsToInsert[0];
if Index1 < Index2 then MultiDelete(Index1 + 1, Index2 - Index1 - 1);
fList.PrepareMultiInsert(Index1 + 1, StringsToInsert.Count - 1);
InsertIndex := Index1 + 1;
for I := 1 to StringsToInsert.Count - 2 do
begin
PutNewItem(InsertIndex, StringsToInsert[I]);
inc(InsertIndex);
end;
PutNewItem(InsertIndex, StringsToInsert[StringsToInsert.Count - 1] + TempStr2);
end;
TempStr1 := '';
TempStr2 := '';
EndUpdate;
end;
end;
procedure TmwEditStrings.LoadFromFile(const FileName: string);
var
Reader: TmwEditFileBuffer;
Max: Integer;
begin
Reader := TmwEditFileBuffer.create(FileName, False);
Max := Reader.Size;
if Max > 524288 then Max := 524288;
Reader.MaxMemorySize := Max;
BeginUpdate;
while not Reader.Eof do Add(Reader.ReadLine);
EndUpdate;
Reader.Free;
end;
procedure TmwEditStrings.MultiDelete(Index, Number: Integer);
var
I: Integer;
begin
if (Index < 0) or (Index >= Count) then exit;
if (Index + Number) > Count then Number := Count - Index;
BeginUpdate;
for I := Index to Index + Number - 1 do
if Assigned(fList[I]) then Dispose(fList[I]);
fList.MultiDelete(Index, Number);
EndUpdate;
end;
procedure TmwEditStrings.Put(Index: Integer; const S: string);
begin
if (Index >= 0) and (Index < fList.Count) then
begin
BeginUpdate;
FList[Index].FString := S;
if Assigned(FOnPutted) then fOnPutted(Index);
EndUpdate;
end;
end;
procedure TmwEditStrings.PutInfo(Index: Integer; AInfo: TObject);
begin
if (Index >= 0) and (Index < fList.Count) then
begin
BeginUpDate;
FList[Index].FInfo := AInfo;
EndUpDate;
end;
end;
procedure TmwEditStrings.PutNewItem(Index: Integer; const S: string);
var
NewItem: PmwEditItem;
begin
New(NewItem);
NewItem.Finfo := nil;
NewItem.FObject := nil;
NewItem.FString := S;
fList[Index] := NewItem;
end;
procedure TmwEditStrings.PutObject(Index: Integer; AObject: TObject);
begin
if (Index >= 0) and (Index < fList.Count) then
begin
BeginUpDate;
FList[Index].FObject := AObject;
EndUpDate;
end;
end;
procedure TmwEditStrings.SaveToFile(const FileName: string);
var
Writer: TmwEditFileBuffer;
I, Max: Integer;
begin
Writer := TmwEditFileBuffer.create(FileName, True);
Writer.UnixStyle := fWriteUnixStyle;
if Count < 1024 then Max:= Length(Text) else Max := Count * 30;
if Max > 524288 then Max := 524288;
Writer.MaxMemorySize := Max;
for I := 0 to Count - 1 do
Writer.WriteLine(fList[I].fString);
Writer.FlushMemory;
Writer.Free;
end;
procedure TmwEditStrings.SetCapacity(NewCapacity: Integer);
begin
if NewCapacity <> Capacity then
begin
BeginUpdate;
fList.Capacity := NewCapacity;
EndUpdate;
end;
end;
procedure TmwEditStrings.SetTextStr(const Value: string);
begin
BeginUpdate;
inherited SetTextStr(Value);
if Assigned(FOnLoaded) then FOnLoaded(Self);
EndUpdate;
end;
procedure TmwEditStrings.SetUpdateState(Updating: Boolean);
begin
if Updating then Changing else Changed;
end;
procedure TmwEditStrings.WndProc(var Message: TMessage);
begin
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?