随便复制几个中文字,然后在 DBGridEh 表格的文本列中任意中间位置进行粘贴,结果有时在不光标位出现,有时直接就乱码了。在有的项目组中有不出现这个问题 。。Delphi 7 (EHLib 4 - EhLib 5) 都试了。

解决方案 »

  1.   

    晕,经过反复测试得出结论了,只要加了 XPManifest(XPMan)那个控件,这个项目就会出DBGridEH表示粘贴出现乱码和错位的问题。何解?
      

  2.   

    我没加这个控件XPManifest(XPMan),但这种情况也不常有
      

  3.   

    虽然没用过XPManifest(XPMan),不过他是不是皮肤控件?如果是的话,建议LZ还是去掉它的好,很多皮肤控件都有类似的问题,例如vclskin等等,我以前也碰到过显示乱码的情况
      

  4.   

    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;
      

  5.   

    XPManifest(XPMan) 是 Delphi 7 安装后在 Win32 控件板中自带的。
      

  6.   

    5楼的 sskk 的方法我没去试,大家有时间试下吧。