2009-12-24 16 views
9

Ben Tutacağını kullanarak bir arsa üzerinde verileri işlemek:MATLAB tutamacının geçerli olup olmadığını nasıl kontrol edebilirim?

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

Ancak, script aslında bu bir hata verir gibi bir şey yapıyor, sonlandırır önce şekil kapalı alırsa.

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

h1 onunla herhangi manipülasyonlar yapmadan önce geçerli bir tanıtıcı olup olmadığını kontrol etmek için bir yolu var mı?

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

GÜNCELLEME: MATLABa yeni sürümleri için

işlemek nesneler sadece sayısal değil gerçek nesneler,

+0

bazı durumlarda yararlı olabilecek bir kolu, kontrol için bir alternatif olduğu için 'set (h1, 'DeleteFcn:

basitçe bir istisna işleme bloğu sonunda kodunuzu yerleştirmek, gibi davaları için ', @delete_fcn_callback) ',' 'işlevi delete_fcn_callback (hObj, event)' tanımladığınız bir şeydir ve şekil silinirken çağrılır. –

cevap

13

Bir grafik tanıtıcı geçerli olup olmadığını kontrol etmek için ilk ishandle işlevini kullanabilirsiniz değerler.

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

Aradığınız nesne türünü biliyorsanız, bunu açıkça test edebilirsiniz. Eğer ishandle (h1) ile birlikte 'u değiştirin. ishandle (h1) && strcmp (get (h1, 'type'), 'line') – Jonas

+0

a = 0. ishandle (a) doğru döndürür. Ama bir rakam değil, yani: eksik cevap. – Pedro77

+0

@ Pedro77: Yanlış. Örnekte olduğu gibi tutamaçları saklıyorsanız ve daha sonra bunları hala geçerli olduğundan emin olmak için 'ishandle 'ile kontrol ediyorsanız, bu durumda tutamacın 0 olduğu bir durum elde edemezsiniz. Yalnızca kök nesne sıfır olabilir; Grafik tutacakları asla olmayacak. – gnovice

4

Not da, ortak bir sayısal 0 (= masaüstü sap) gibi değerleri ve 1 kabul bakımından bir dezavantaja (= birinci açık Şekil göre olan ishandle: daha iyi bir seçenek kolu nesneleri için isvalid yöntemini kullanmaktır varsayılan olarak da geçerli olan) beklenen beklemesine rağmen. Var olmayan bir özellik ayarlamaya çalıştığınızda hala bir hata göreceksiniz.

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

Bir deneme/yakalama bloğu iyi bir çözümdür. Bununla birlikte, '0' tutamacı her zaman kök nesnesi için ayrılır ve çizim nesneleri veya uicontroller her zaman kayan nokta tutamaçlarına sahiptir. Rakamlar varsayılan olarak tamsayı tutamaçlarına sahiptir, ancak MATLAB'ı "IntegerHandle" değerine 'off' olarak ayarlanmış şekilde şekil oluşturarak şekiller için bir kayan nokta tutamacını kullanmaya zorlayabilirsiniz. Bu, bir şeklin oluşturulduğu durumdan, tamsayı tutamacının saklanmasından ve şekil silinip, aynı tamsayı tutamacıyla oluşturulmuş yeni bir rakamdan kaçınacaktır (bu nedenle, ilk tutamaçtan daha farklı bir rakamdır). – gnovice

İlgili konular