2009-12-24 12 views
9

manipulować dane na działce przy użyciu jego uchwyt:Jak mogę sprawdzić, czy uchwyt MATLAB jest prawidłowy?

x = 1:10; y = sin(x); 
h1 = line(x,y); 

Jednakże, jeśli postać zostanie zamknięty przed skrypt faktycznie kończy, robi coś tak zwraca błąd.

>>set(h1,'Color','green') % line is green 
??? Error using ==> set 
Invalid handle object. 

Czy istnieje sposób, aby sprawdzić, czy h1 jest prawidłowy uchwyt przed wykonaniem jakichkolwiek manipulacji z nim?

+0

Alternatywą dla sprawdzania uchwyt, który może być przydatny w niektórych przypadkach ma 'set (h1,„DeleteFcn ', @delete_fcn_callback) ', gdzie' function delete_fcn_callback (hObj, event) 'jest czymś, co definiujesz i zostanie wywołane, gdy figurka jest usuwana. –

Odpowiedz

13

Można użyć funkcji ishandle najpierw sprawdzić, czy uchwyt grafika jest ważny:

if ishandle(h1) 
    set(h1, 'Color', 'green'); 
end 

UPDATE:

nowsze wersje MATLAB, uchwyt przedmioty są rzeczywiste przedmioty, nie tylko liczbowe wartości. Lepszym rozwiązaniem jest zastosowanie metody isvalid dla obiektów uchwycie:

if isvalid(h1) 
    set(h1, 'Color', 'green'); 
end 
+3

Jeśli wiesz, jakiego rodzaju obiektu szukasz, możesz go przetestować jawnie. Zastąp , jeśli ishandle (h1) z np. if ishandle (h1) && strcmp (get (h1, 'type'), 'line') – Jonas

+0

a = 0. ishandle (a) zwraca wartość true. Ale a nie jest liczbą, więc: niekompletna odpowiedź. – Pedro77

+0

@ Pedro77: Niepoprawnie. Jeśli przechowujesz uchwyty, tak jak w przykładzie, i sprawdzasz je później za pomocą 'ishandle', aby upewnić się, że są nadal poprawne, to nigdy nie uzyskasz sytuacji, w której uchwyt wynosi 0. Tylko obiekt główny może mieć wartość zero; Uchwyty graficzne nigdy nie będą. – gnovice

4

Należy zauważyć, że ishandle ma taką wadę, że również przyjmuje te same wartości liczbowe jak 0 (= uchwytu stacjonarnego) i 1 (= pierwszym otwartym rysunku, z domyślnie), które często są również ważnymi uchwytami, chociaż prawdopodobnie nie są oczekiwane uchwyt. W dalszym ciągu zobaczysz błąd, jeśli spróbujesz ustawić nieistniejącą właściwość.

Do obsługi takich przypadków, wystarczy umieścić kod wewnątrz bloku obsługi wyjątków:

try 
    set(myHandle,propName,propValue); 
catch 
    % do something useful... (recreate the GUI?) 
end 
+2

Blok try/catch to dobre rozwiązanie. Jednak uchwyt '0' jest zawsze zarezerwowany dla obiektu głównego, a obiekty plot lub uicontrol zawsze posiadają uchwyty zmiennoprzecinkowe. Liczby mają domyślne liczby całkowite, ale można zmusić MATLAB do użycia liczb zmiennoprzecinkowych dla liczb, tworząc liczbę z właściwością "IntegerHandle" ustawioną na "off". Pozwoli to uniknąć sytuacji, w której tworzona jest liczba, przechowywany jest uchwyt liczby całkowitej, a następnie liczba zostaje usunięta, a nowa figura jest tworzona z tym samym całkowitym uchwytem (czyli w rzeczywistości jest to inna liczba niż odnosi się do pierwszego uchwytu). – gnovice

Powiązane problemy