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 + -
显示快捷键?