Почему TList. Удалить () создание ошибки EAccessViolation?

Хотя этот будет работать, возможно, будет лучшее решение, если вы хотите, чтобы ваш TextView действовал больше как стандарт EditText и отображал контекстное меню.

Вы можете сделать что-то вроде этого

class SomeActivity : AppCompatActivity() {

    override fun onCreate() {
        // super.onCreate() and setContentView() calls ommited for clarity

        // Assuming that pastableTextView is the TextView you want to paste into
        registerForContextMenu(pastableTextView)
    }

    override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
        // oversimplified for sake of example
        if (v?.id == pastableTextView.id) {
            menu?.add(0, v.id, 0, android.R.string.paste)
        }
    }

    override fun onContextItemSelected(item: MenuItem?): Boolean {
        // again, oversimplified for the sake of example
        if (item?.itemId == pastableTextView.id) {
            val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager?
            // This is clipboard's contents
            val content = clipboardManager?.primaryClip?.getItemAt(0)?.text?
        }

        return false
    }
}

Имейте в виду, что этот код не является оптимальным, и я не рекомендую использовать его для производственного приложения, как есть.

8
задан Cody Gray 18 August 2011 в 12:07
поделиться

4 ответа

Это похоже на ошибку.

Если Вы компилируете с dcu's отладки (обычно не делают этого, если Вы не хотите освободить свою исправность!) Вы видите, что вызов к компаратору пошел не так, как надо. (Возможно дополнительный) третье значение сравнить функции не установлено и вызывает нарушение прав доступа.

Так возможно Вы не можете поместить указатели метода в универсальный список.

Хорошо следующие работы:

uses
  Generics.Defaults;

type
  TForm4 = class(TForm)
    ...
  private
    procedure myNotifyEvent(Sender: TObject);
  end;

TComparer<T> = class (TInterfacedObject, IComparer<T>)
public
  function Compare(const Left, Right: T): Integer;
end;

implementation

uses
  Generics.Collections;

var
  list: TList<TNotifyEvent>;
begin
  list := TList<TNotifyEvent>.Create(TComparer<TNotifyEvent>.Create);
  try
    list.Add(myNotifyEvent);
    list.Remove(myNotifyEvent);
  finally
    FreeAndNil(list);
  end;
end;

procedure TForm4.myNotifyEvent(Sender: TObject);
begin
  ShowMessage('event');
end;

{ TComparer<T> }

function TComparer<T>.Compare(const Left, Right: T): Integer;
begin
  Result := 0;
end;

Необходимо определить собственный компаратор с possiby еще некоторая аналитика ;-).

5
ответ дан 5 December 2019 в 19:04
поделиться

вышеупомянутый код используется в TForm1...

uses 
  Generics.Collections;

procedure TForm1.Button1Click(Sender: TObject);
var
  list: TList<TNotifyEvent>;
begin
  list := TList<TNotifyEvent>.Create();
  try
    list.Add(myNotifyEvent);
    list.Remove(myNotifyEvent);  // EAccessViolation at address...
  finally
    FreeAndNil(list);
  end;
end;
procedure TForm1.myNotifyEvent(Sender: TObject);
begin
  OutputDebugString('event');  // nebo cokoliv jineho
end;
0
ответ дан 5 December 2019 в 19:04
поделиться

Действительно ли возможно передать пользовательский компаратор TList<T>? У меня нет D2009 передо мной, так не может попробовать его.

1
ответ дан 5 December 2019 в 19:04
поделиться

Нарушение доступа вызвано отсутствием сравнителя. Я подозреваю, что это было исправлено в патче, но проблема все равно остается (по крайней мере, в Delphi 2009), если вы используете TObjectList, так что я просто обновляю простейшее решение:

TList<TNotifyEvent>.Create(TComparer<TNotifyEvent>.Default);

или в моем случае

TObjectList<TNotifyEvent>.Create(TComparer<TNotifyEvent>.Default);
3
ответ дан 5 December 2019 в 19:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: