diff --git a/funcext/tvclib/twincontrol.tsf b/funcext/tvclib/twincontrol.tsf index 9a683fc..1a6f808 100644 --- a/funcext/tvclib/twincontrol.tsf +++ b/funcext/tvclib/twincontrol.tsf @@ -1263,6 +1263,12 @@ type TWinControl = class(tcontrol) //rc := ps._getvalue_("rcpaint"); img := _wapi.cairo_image_surface_create(1,cr[2]-cr[0]+100,cr[3]-cr[1]+100); memdc := _wapi.cairo_create(img); + + rcpaint := ps.rcpaint; + _wapi.gtk_object_set_data(memdc,nil); + _wapi.cairo_reset_clip(memdc); + rng := _wapi.CreateRectRgn(rcpaint[0],rcpaint[1],rcpaint[2],rcpaint[3]); + _wapi.SelectClipRgn(memdc,rng); {$endif} e.wparam := memdc; if Color then @@ -1272,9 +1278,11 @@ type TWinControl = class(tcontrol) Dispatch(o,e); e.wparam := 0; rc := ps.rcpaint; + {$ifdef gdipaint} _wapi.BitBlt(dc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1],memdc,rc[0],rc[1],SRCCOPY); //_wapi.BitBlt(dc,c[0],c[1],c[2],c[3],memdc,0,0,SRCCOPY); {$else} + _wapi.SelectClipRgn(memdc,0); _wapi.cairo_set_source_surface(dc, img, 0, 0); _wapi.cairo_rectangle(dc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1]); _wapi.cairo_clip(dc); @@ -1417,8 +1425,8 @@ type TWinControl = class(tcontrol) c := array(0,0); //设置基准点,为00 20201112 修改 rcpaint := PaintStruct().rcpaint; if sum(rcpaint)<4 then exit; - rgC := _wapi.CreateRectRgn(0,0,10,10); - rga := _wapi.CreateRectRgn(rcpaint[0],rcpaint[1],rcpaint[2],rcpaint[3]); + //rgC := _wapi.CreateRectRgn(0,0,10,10); + //rga := _wapi.CreateRectRgn(rcpaint[0],rcpaint[1],rcpaint[2],rcpaint[3]); try for i := 0 to ControlCount-1 do begin @@ -1433,8 +1441,9 @@ type TWinControl = class(tcontrol) end //rgb := _wapi.CreateRectRgn(itbounds[0],itbounds[1],itbounds[2],itbounds[3]); //控件区域 rgb := _wapi.CreateRectRgn(outrect[0],outrect[1],outrect[2],outrect[3]); //控件区域 - _wapi.CombineRgn(rgC,rga,rgb,RGN_AND); //控件绘画区域 - bkrg := _wapi.SelectClipRgn(TheMessage.wparam,rgc); //裁剪区域 + //_wapi.CombineRgn(rgC,rga,rgb,RGN_AND); //控件绘画区域 + //bkrg := _wapi.SelectClipRgn(TheMessage.wparam,rgc); //裁剪区域 + bkrg := _wapi.SelectClipRgn(TheMessage.wparam,rgb); //裁剪区域 try pts := it.PaintStruct(); pts._setvalue_("rcpaint",array(outrect[0]-itbounds[0],outrect[1]-itbounds[1],outrect[2]-itbounds[0],outrect[3]-itbounds[1])); @@ -1449,8 +1458,8 @@ type TWinControl = class(tcontrol) end end finally - _wapi.DeleteObject(rga); - _wapi.DeleteObject(rgc); + //_wapi.DeleteObject(rga); + //_wapi.DeleteObject(rgc); end; end procedure PaintWindow(DC:HDC);virtual; diff --git a/funcext/tvclib/ugtkinterface.tsf b/funcext/tvclib/ugtkinterface.tsf index 18750f1..d6b91f3 100644 --- a/funcext/tvclib/ugtkinterface.tsf +++ b/funcext/tvclib/ugtkinterface.tsf @@ -741,17 +741,24 @@ type tsgtkapi = class(tgtkapis) InvalidateRect(hwnd,0,f); end //////////////////////////////gdi/////////////////////////////////////////// + function cairo_clear_clip(hdc,rc); + begin + cairo_reset_clip(hdc); + cairo_rectangle(hdc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1]); + cairo_clip(hdc); + end function SelectObject(hdc :pointer;gdiobj:pointer); begin // if not hdc then return 0; if not(gdiobj>0 or gdiobj<0) then return 0; global gtk_gdi_object_globals; - if not ifarray(gtk_gdi_object_globals) then return 0; - obj := gtk_gdi_object_globals[inttostr(gdiobj)]; + gdiindex := inttostr(gdiobj); + obj := gtk_gdi_object_globals[gdiindex]; if not obj then return 0; t := obj[1]; o := obj[0]; + //gtk_gdi_object_globals[gdiindex,"hdc"] := hdc; case obj[1] of "pen": begin @@ -774,10 +781,24 @@ type tsgtkapi = class(tgtkapis) end "rgn": begin + x := gtk_object_get_data(dc,"viewport.x"); + y := gtk_object_get_data(dc,"viewport.y"); r := gtk_object_get_data(hdc,"rgn"); gtk_object_set_data(hdc,"rgn",gdiobj); + rc := (new TCRect(gdiobj))._getdata_(); + rc[0]+=x; + rc[2]+=x; + rc[1]+=y; + rc[3]+=y; + gtk_object_set_data(hdc,"rgn-rec",rc); + cairo_clear_clip(hdc,rc); + end end ; + if r then + begin + //if ifarray(gtk_gdi_object_globals[inttostr(r)]) then gtk_gdi_object_globals[inttostr(r),"hdc"] := nil; + end return r; end function textoutexa(hdc :pointer;X:integer;y:integer;txt:string;len:integer):integer; @@ -786,8 +807,7 @@ type tsgtkapi = class(tgtkapis) // gtk_rgb_color_rgb(cl,r,g,b); // cairo_set_source_rgb(hdc, r, g, b); xb := gtk_object_get_data(hdc,"viewport.x"); - yb := gtk_object_get_data(hdc,"viewport.y"); - make_sure_rgn(hdc,xb,yb); + yb := gtk_object_get_data(hdc,"viewport.y"); ft := gtk_object_get_data(hdc,"font"); global gtk_gdi_object_globals; if ft and ifarray(gtk_gdi_object_globals) then @@ -1038,17 +1058,17 @@ type tsgtkapi = class(tgtkapis) begin sy := rec[3]-3-ht; end - bk := gtk_object_get_data(hdc,"rgn-rec"); - gtk_object_set_data(hdc,"rgn-rec",rec); - r := TextOutexA(hdc,sx,sy,txt,slen); - if ifarray(bk) then + rgnrec := gtk_object_get_data(hdc,"rgn-rec"); + if rgnrec then begin - - end else - begin - cairo_reset_clip(hdc); - end - gtk_object_set_data(hdc,"rgn-rec",bk); + x := gtk_object_get_data(hdc,"viewport.x"); + y := gtk_object_get_data(hdc,"viewport.y"); + reci := array(rec[0]+x,rec[1]+y,rec[2]+x,rec[3]+y); + if not intersectrect(rgnrec,reci,reco) then return 0; + cairo_clear_clip(hdc,reco); + end + r := TextOutexA(hdc,sx,sy,txt,slen); + if rgnrec then cairo_clear_clip(hdc,rgnrec); return r; end Function SetTextColor(hdc :pointer;col:integer):integer; @@ -1086,7 +1106,6 @@ type tsgtkapi = class(tgtkapis) cl := brs[0].Color; x := gtk_object_get_data(dc,"viewport.x"); y := gtk_object_get_data(dc,"viewport.y"); - make_sure_rgn(hdc,x,y); cairo_rectangle(dc, x+rec[0], y+rec[1], rec[2]-rec[0], rec[3]-rec[1]); gtk_rgb_color_rgb(cl,r,g,b); cairo_set_source_rgb(dc,r,g,b); @@ -1105,22 +1124,12 @@ type tsgtkapi = class(tgtkapis) cl := brs[0].Color; x := gtk_object_get_data(dc,"viewport.x"); y := gtk_object_get_data(dc,"viewport.y"); - make_sure_rgn(hdc,x,y); cairo_rectangle(dc, x+rec[0], y+rec[1], rec[2]-rec[0], rec[3]-rec[1]); gtk_rgb_color_rgb(cl,r,g,b); cairo_set_source_rgb(dc,1-r,1-g,1-b); cairo_fill(dc); end end - function make_sure_rgn(hdc,x,y); - begin - rc := gtk_object_get_data(hdc,"rgn-rec"); - if rc then - begin - cairo_rectangle(hdc,rc[0]+x,rc[1]+y,rc[2]-rc[0],rc[3]-rc[1]); - cairo_clip(hdc); - end - end function ReleaseDC(hwd :pointer;hdc:pointer):integer; begin DeleteDC(hdc); @@ -1134,42 +1143,11 @@ type tsgtkapi = class(tgtkapis) gtk_object_set_data(hdc,"rgn-rec",nil); cairo_reset_clip(hdc); end - else - begin - rr := gtk_object_get_data(hdc,"rgn"); - if rr = gdiobj then return ; - p := new TCRect(gdiobj); - rc := p._getdata_(); - gtk_object_set_data(hdc,"rgn-rec",rc); - end - return r; - - return r; - r := SelectObject(hdc,gdiobj); - if not(gdiobj) then - begin - gtk_object_set_data(hdc,"rgn",nil); - cairo_reset_clip(hdc); - end - else - begin - rr := gtk_object_get_data(hdc,"rgn"); - if rr = gdiobj then return ; - p := new TCRect(gdiobj); - rc := p._getdata_(); - cairo_reset_clip(hdc); - x := gtk_object_get_data(dc,"viewport.x"); //控制基准位置 - y := gtk_object_get_data(dc,"viewport.y"); - cairo_rectangle(hdc,rc[0]+x,rc[1]+y,rc[2]-rc[0],rc[3]-rc[1]); - cairo_clip(hdc); - //gtk_object_set_data(hdc,"rgn",gdiobj); - end return r; end function CreateRectRgn(nLeftRect:integer;nTopRect:integer;nRightRect:integer;nBottomRect:integer):pointer; begin - global gtk_gdi_object_globals; - if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array(); + global gtk_gdi_object_globals; p := new TCRect(); p.left := nLeftRect; p.top := nTopRect; @@ -1213,10 +1191,11 @@ type tsgtkapi = class(tgtkapis) function DeleteObject(gdiobj :pointer);//删除gdi对象 begin global gtk_gdi_object_globals; - if not ifarray(gtk_gdi_object_globals) then return 0; - r := gtk_gdi_object_globals[inttostr( gdiobj)]; + gdiindex := inttostr( gdiobj); + r := gtk_gdi_object_globals[gdiindex]; if r then begin + //if ifarray(gtk_gdi_object_globals[inttostr(r)]) then gtk_gdi_object_globals[inttostr(r),"hdc"] := nil; reindex(gtk_gdi_object_globals,array(inttostr(gdiobj):nil)); return true; end @@ -1242,7 +1221,6 @@ type tsgtkapi = class(tgtkapis) function CreatePen(FS,w,FC); //gtk 模拟 pen begin global gtk_gdi_object_globals; - if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array(); p := new ttgtk_pen(); p.width := w; p.color := FC; @@ -1255,7 +1233,6 @@ type tsgtkapi = class(tgtkapis) function CreateSolidBrush(crColor:integer); begin global gtk_gdi_object_globals; - if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array(); p := new ttgtk_brush(); p.color := crColor; ptr := p._getptr_(); @@ -1263,10 +1240,8 @@ type tsgtkapi = class(tgtkapis) return ptr; end function CreateFontIndirectA(lplf:pointer); - begin - + begin global gtk_gdi_object_globals; - if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array(); p := new ttgtk_font(); p2 := new ttgtk_font(lplf); for i,v in array("height","width","escapement","orientation","weight","italic","underline","strikeout","charset","outprecision","clipprecision","quality","pitchandfamily","facename") do @@ -1308,8 +1283,7 @@ type tsgtkapi = class(tgtkapis) gtk_rgb_color_rgb(pc,rc,gc,bc); cairo_set_source_rgb(dc,rc,gc,bc); end - cairo_applay_pen_style(dc); - make_sure_rgn(hdc,xb,yb); + cairo_applay_pen_style(dc); //LineTo xy := gtk_object_get_data(dc,"movepointto"); if xy then begin @@ -1508,7 +1482,7 @@ type tsgtkapi = class(tgtkapis) global gtk_gdi_object_globals; wd := 8; ht := 16; - if ft and ifarray(gtk_gdi_object_globals) then + if ft then begin fto := gtk_gdi_object_globals[inttostr(ft)]; if fto then fto := fto[0]; @@ -1861,7 +1835,7 @@ type tsgtkapi = class(tgtkapis) y := gtk_object_get_data(dc,"viewport.y"); pc := gtk_object_get_data(dc,"pen.color"); pw := gtk_object_get_data(dc,"pen.width"); - if pw>0 then cairo_set_line_width(dc,pw); + if pw>0 then cairo_set_line_width(dc,pw); else cairo_set_line_width(dc,1); if pc=0 then begin @@ -2543,6 +2517,7 @@ type tsgtkapi = class(tgtkapis) global g_gtk_ttimer_cache; if not ifarray(g_gtk_ttimer_cache) then return 0; obj := g_gtk_ttimer_cache[nIDEvent] ; + if not obj then return 0; g_source_remove(obj._getvalue_(0)); reindex(g_gtk_ttimer_cache,array(nIDEvent:nil)); return true; @@ -3011,6 +2986,7 @@ type tsgtkapi = class(tgtkapis) SetActiveWindow(hwd); end //socket + { function socket(af:integer;tp:integer;protocol:integer):pointer;begin end function WSAStartup(af:SHORT;DA:pointer):integer;begin end function WSACleanup():integer;begin end @@ -3032,6 +3008,7 @@ type tsgtkapi = class(tgtkapis) function ioctlsocket(s:pointer;cmd:integer;var argp:integer):integer;begin end function setsockopt(s:pointer;level:integer;optname:integer;optval:string;optlen:integer):integer;begin end function getsockopt(s:pointer;level:integer;optname:integer;var optval:string;var optlen:integer):integer;begin end + } end @@ -4009,6 +3986,11 @@ type tgtkapis = class() //gtk _f_ := static function(kmp:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(kmp); end + function gdk_keymap_get_caps_lock_state(kmp:pointer):integer; + begin + _f_ := static function(kmp:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); + return ##_f_(kmp); + end function gdk_screen_get_default():pointer; begin @@ -4669,9 +4651,9 @@ type tgtkapis = class() //gtk _f_ := static procedure(c:pointer;var x1:double;var y1:double;var x2:double;var y2:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,x1,y1,x2,y2); end - function cairo_in_clip(c:pointer;x:double;y:double); + function cairo_in_clip(c:pointer;x:double;y:double):integer; begin - _f_ := static function(c:pointer;x:double;y:double);cdecl;external getfuncptrbyname(0,functionname()); + _f_ := static function(c:pointer;x:double;y:double):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,x,y); end procedure cairo_reset_clip(c:pointer); @@ -4844,10 +4826,18 @@ type tgtkapis = class() //gtk begin _f_ := static procedure(c:pointer;offset:double;r:double;g:double;b:double;a:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,offset,r,g,b,a); - end - - + end /////////////////////////window////////// + procedure gtk_window_set_keep_above(w:pointer;f:integer); + begin + _f_ := static procedure(w:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname()); + return ##_f_(w,f); + end + procedure gtk_window_set_keep_below(w:pointer;f:integer); + begin + _f_ := static procedure(w:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname()); + return ##_f_(w,f); + end function gtk_window_list_toplevels():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); @@ -8124,6 +8114,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) //cr := _wapi.gdk_cairo_create(_wapi.gtk_widget_get_window(hd)); cr :=c;//rec := r; rec := zeros(4); _wapi.gdk_cairo_get_clip_rectangle(cr,rec); + _Wapi.g_object_get_data(cr,nil); //_wapi.cairo_clip_extents(cr,x,y,w,h); hwd := handle; _wapi.g_object_set_data(hwd,"paint_dc",cr); @@ -8151,7 +8142,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) CallTslVclProc(_const.WM_NCPAINT,0,cr); //绘制 end end - //_wapi.cairo_destroy(cr); + //_wapi.cairo_destroy(cr); _wapi.gtk_object_set_data(cr); end; function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);override; @@ -8452,7 +8443,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) private ftarget ; fscrollinfos; - ftimerobj; + ftimerobj;ftimerfptr; Fscrolltimedo; FStatscrollTime; public @@ -8498,8 +8489,22 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) dr := ed.direction; if dr<>0 and dr<>1 then return ; x := ed.x;//ed.x_root; - y := ed.y;//ed.y_root; - r := array(); + y := ed.y;//ed.y_root;-_wapi.gtk_object_get_data_title_height(h); + //////////////位置处理//////////////////////////////////////////////////////// + mb := _wapi.g_object_get_data(h,"menubar"); + if mb and _wapi.gtk_widget_is_visible(mb) then + begin + rec := zeros(4); + _wapi.gtk_widget_get_allocation(mb,rec); + y-=rec[3]; + end + if _wapi.gdk_backend_is_wayland() then + begin + global g_gtk_shadow_width,g_gtk_shadow_heigt; + y-=integer(g_gtk_shadow_heigt/2);//_wapi.gtk_object_get_data_title_height(h); + end + //////////////////////////////////////////////////////// + r := array(); _wapi.GetTopWidgetList(h,x,y,r); lenr := length(r)-1; for i := lenr downto 0 do @@ -8523,7 +8528,8 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) if not ftimerobj then begin fscrollinfos := array(); - Fscrolltimedo := makeinstance(thisfunction(scrolltimedo)); + ftimerfptr := makeinstance(weakref_get(thisfunction(scrolltimedo))); + Fscrolltimedo := ftimerfptr; ftimerobj := new ttmstruct(nil); rt := _wapi.g_timeout_add(8,Fscrolltimedo,ftimerobj._getptr_() ); ftimerobj._setvalue_(0,rt); @@ -8541,6 +8547,14 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) function Destroy();override; begin inherited; + if ftimerobj then + begin + _wapi.g_source_remove(ftimerobj._getvalue_(0)); + deleteinstance(ftimerfptr); + ftimerfptr := 0; + ftimerobj := nil; + end + get_instance_u(thisfunction(do_motion)); get_instance_u(thisfunction(do_received)); get_instance_u(thisfunction(do_drop)); @@ -8677,7 +8691,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) eheight := cf.height; dw := abs(AWidth-ewidth); dh := abs(AHeight-eheight); - if dw>10 and dh>10 then + if dw>10 and dh>10 and dw<200 and dh<200 then begin g_gtk_shadow_width := dw; g_gtk_shadow_heigt := dh; @@ -9613,8 +9627,9 @@ begin global g_w_i_datas,g_w_c_width, g_gtk_buttontable,g_gtk_keytable, g_gtk_call_handler_manager,g_gtk_font_get_size,g_gtk_dragxy, g_gtk_shadow_width,g_gtk_shadow_heigt,g_gtk_shadow_size_nset, - G_E_ID_Name_1,G_E_ID_Name_2,g_Caret_Blink_Time,g_ansi_unit_cache; + G_E_ID_Name_1,G_E_ID_Name_2,g_Caret_Blink_Time,g_ansi_unit_cache,gtk_gdi_object_globals; g_ansi_unit_cache := array(); + gtk_gdi_object_globals := array(); G_E_ID_Name_2 := array(); G_E_ID_Name_1 := array( "wm-user":10, diff --git a/funcext/tvclib/utslvcldlg.tsf b/funcext/tvclib/utslvcldlg.tsf index 9834a74..02a4320 100644 --- a/funcext/tvclib/utslvcldlg.tsf +++ b/funcext/tvclib/utslvcldlg.tsf @@ -1067,7 +1067,6 @@ type TcustomInPutQuerys= class(tcustomscrollcontrol) static SFInputType; static SHashInited; end -implementation type TInputEditor=class() {** @ignore(忽略) %% @@ -1121,6 +1120,7 @@ type TInputEditor=class() end FNextCtrl; end +implementation type tinputbool=class(tcustomcheckbtn,TInputEditor) {** @explan(说明) 输入框 %% @@ -1429,7 +1429,7 @@ begin global g_dlg_call_back; if not g_dlg_call_back then begin - g_dlg_call_back := makeinstance(thisfunction(folderdlgcall)); + g_dlg_call_back := makeinstance(weakref_get( thisfunction(folderdlgcall))); end return g_dlg_call_back; end diff --git a/funcext/tvclib/utslvclpage.tsf b/funcext/tvclib/utslvclpage.tsf index 913e033..5efca70 100644 --- a/funcext/tvclib/utslvclpage.tsf +++ b/funcext/tvclib/utslvclpage.tsf @@ -729,6 +729,12 @@ type tcustompagecontrol = class(TCustomControl) function acceptsheettype(ty,del); begin idx := 0; + if ifstring(ty) and ty then + begin + ob := findclass(ty); + if ob then return acceptsheettype(ob,del); + return false; + end if ty is class(tcontrol) then begin idx := inttostr(int64(ty)); @@ -741,6 +747,7 @@ type tcustompagecontrol = class(TCustomControl) begin faccepttype[idx] := ty; end + return true; end {** @param(cursel)(integer) 当前选中序号 %% diff --git a/funcext/tvclib/utslvclstdctl.tsf b/funcext/tvclib/utslvclstdctl.tsf index c266faa..5a8956b 100644 --- a/funcext/tvclib/utslvclstdctl.tsf +++ b/funcext/tvclib/utslvclstdctl.tsf @@ -6767,7 +6767,65 @@ type tcustomprocess = class(tcomponent) // ftm.Interval := 500; ftm.Ontimer := thisfunction(dispatchproc); end - end + end + function executeblock(exe,cmd); //阻塞执行 + begin + if fprocesshandle then return 0; + if fexecstr then + begin + e := exe; + if not(ifstring(e) and e) then return 0; + arg := cmd; + end else + begin + if not parserasexeclevparam(exe,cmd,e,arg,envp) then return 0; + end + //////////////处理linux启动路径///////////////////// + {$ifdef linux} + for i := length(e) downto 2 do + begin + if e[i]="/" then + begin + ph := e[1:i]; + break; + end + end + envp := array(); + if ph then + begin + envp[length(envp)] := "LD_LIBRARY_PATH="+ph; + end + Sysexecsetenvs(envp,1); + {$endif} + ///////////////////////////处理管道//////////////////////// + Sysexecnewpipe(0); + ferrinfo := nil; + sdir :=nil; + if ifstring(fStartupDirectory) and fStartupDirectory then + begin + if fStartupDirectory[length(fStartupDirectory)]=iofileseparator() then + begin + if filelist("",fStartupDirectory+"*") then + begin + sdir := fStartupDirectory; + end + end else + begin + if filelist("",fStartupDirectory) then + begin + sdir := fStartupDirectory+iofileseparator(); + end + end + end + hd := sysexec(e,arg,sdir,true,code); + if ifarray(code) then + begin + doprocecho(self(true),code["out"]); + ferrinfo:=code["code"]; + end + Sysexecdeletepipe(0); + return hd; + end function CreateProcess(exe,cmd,exitWithParent); begin {**