DBGridEh 在粘贴中文时出现乱码和错位 100zhx_888]

http://www.fx114.net/qa-29-3439.aspx

 

 

回复于: 2011-10-11 15:02:08

unit DBGridEh; 







把下面这个函数替换成这样







procedure TDBGridInplaceEdit.WMPaste(var Message: TMessage);

var

  ClipboardText: WideString;

  FSearchText, AText, tmpText: WideString;

  AColumn: TColumnEh;

  Idx: Integer;

  CanChange, TextLocated, CanTryEdit: Boolean;

  EditKeyValue: Variant;

  NewSelStart: Integer;

begin

  if Grid.AllowedOperationUpdate and Column.CanModify(False) then

    if ((EditStyle = esDataList) or (Column.GetColumnType = ctKeyPickList)) then

    begin

      if Clipboard.HasFormat(CF_TEXT)

        then ClipboardText := Clipboard.AsText

        else Exit;

      with Grid do AColumn := Columns[SelectedIndex];

      FSearchText := Copy(Text, 1, SelStart) + ClipboardText + Copy(Text, SelStart + SelLength + 1, MAXINT);

      CanTryEdit := False;

      TextLocated := False;

      AText := FSearchText;

      if (EditStyle = esDataList) and (AColumn.UsedLookupDataSet <> nil) then //lookup

      begin

        EditKeyValue := Null;

        if AColumn.UsedLookupDataSet.Locate(AColumn.Field.LookupResultField, FSearchText,

          [loCaseInsensitive, loPartialKey]) then

        begin

          AText := AColumn.UsedLookupDataSet.FieldByName(AColumn.Field.LookupResultField).Text;

          EditKeyValue := AColumn.UsedLookupDataSet.FieldValues[AColumn.Field.LookupKeyFields];

          TextLocated := True;

          CanTryEdit := True;

        end

        else if Assigned(AColumn.OnNotInList) then

          CanTryEdit := True;



        if CanTryEdit then

        begin

          Grid.DataLink.Edit;

          CanChange := Grid.Datalink.Editing;

          if CanChange then

          begin

            Grid.Datalink.Modified;

            Text := AText;

            SelStart := Length(Text);

            if TextLocated

              then SelLength := Length(FSearchText) - SelStart

              else SelLength := 0;

            Grid.FEditKeyValue := EditKeyValue;

            Grid.FEditText := Text;

            if Assigned(FDataList) then FDataList.KeyValue := Grid.FEditKeyValue;

          end;

        end;

      end else //keypicklist

      begin

        Idx := StringsLocate(AColumn.PickList, FSearchText, [loCaseInsensitive, loPartialKey]);

        if (Idx <> -1) and Grid.CanEditModifyText then

        begin

          AText := AColumn.PickList[Idx];

          TextLocated := True;

          CanTryEdit := True;

        end

        else if Assigned(AColumn.OnNotInList) then

          CanTryEdit := True;



        if CanTryEdit then

        begin

          SelStart := Length(AText);

          if TextLocated

            then SelLength := Length(FSearchText) - SelStart

            else SelLength := 0;



          Grid.DataLink.Edit;

          CanChange := Grid.Datalink.Editing;

          if CanChange then Grid.Datalink.Modified;

          Text := AText;



          Grid.FEditText := Text;

          if Assigned(FPickList) then FPickList.ItemIndex := Idx;

        end;

      end;

    end else

    begin

      if EditCanModify and

          ( Clipboard.HasFormat(CF_TEXT) or

            Clipboard.HasFormat(CF_OEMTEXT) or

            Clipboard.HasFormat(CF_UNICODETEXT)

          )  then

      begin

        with Grid do AColumn := Columns[SelectedIndex];

        ClipboardText := Clipboard.AsText;

        AText := AColumn.GetAcceptableEditText(ClipboardText);



        tmpText := Text;

        FSearchText := Copy(tmpText, 1, SelStart) + AText + Copy(tmpText, SelStart + SelLength + 1, MAXINT);

        NewSelStart := Length(Copy(tmpText, 1, SelStart) + AText);

        Grid.DataLink.Edit;

        if Grid.Datalink.Editing then

        begin

          Grid.Datalink.Modified;

          Text := FSearchText;

          SelStart := NewSelStart;

          Grid.FEditText := Text;

          SendMessage(Handle, EM_SCROLLCARET, 0,0);

        end;

      end else

        inherited;

    end;

end;

 

你可能感兴趣的:(grid)