WPFObjects - устранение мелких ошибок поворота и центрирования текста
This commit is contained in:
Mikhalkovich Stanislav 2019-04-22 22:25:12 +03:00
parent d35fcda955
commit 795b4e79f8
5 changed files with 88 additions and 45 deletions

View file

@ -396,6 +396,7 @@ namespace VisualPascalABCPlugins
void WriteToOutputBox(string message, bool is_exc);
void ClearOutputTextBoxForTabPage(ICodeFileDocument tabPage);
void AddTabWithUrl(string title, string url);
void AddTextToCompilerMessagesSync(string text);
}
public interface IWorkbenchOptionService

View file

@ -302,7 +302,11 @@ namespace VisualPascalABC
File.AppendAllText("logRun.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
RemoveFromTables(fileName);
throw;
// перехватываю!
//PRunner.ProcessExited -= new EventHandler(PRunner_ProcessExited);
//if (Exited != null)
// Exited(fileName);
throw; // Это не перехватывается и приводит к вылету оболочки - SSM 22/04/19
}
}

View file

@ -188,7 +188,10 @@ namespace VisualPascalABC
}
catch (System.Exception e)
{
throw;
// SSM 22/04/19 - исправляю вылет оболочки при отсутствии exe файла
this.RunnerManager_Exited(OutputFileName);
WorkbenchServiceFactory.OperationsService.AddTextToOutputWindowSync(OutputFileName,"Произошла непредвиденная ошибка. Вероятно, на диске отсутствует .exe-файл. Повторите запуск");
//throw;
}
if (!ProjectFactory.Instance.ProjectLoaded)
DocumentService.ActiveCodeFileDocument = tabPage;

View file

@ -21,7 +21,8 @@ namespace VisualPascalABC
void RunnerManager_Started(string fileName)
{
Workbench.BeginInvoke(new SetTextDelegate(RunnerManager_Started_Sync), fileName);
RunnerManager_Started_Sync(fileName);
//Workbench.BeginInvoke(new SetTextDelegate(RunnerManager_Started_Sync), fileName);
}
void ButtonsEnableDisable_RunStart()
@ -59,11 +60,6 @@ namespace VisualPascalABC
}
}
void RunnerManager_Started_Sync_Thread(object fileName)
{
RunnerManager_Started_Sync(fileName as string);
}
void RunnerManager_OutputStringReceived(string fileName, RunManager.StreamType streamType, string text)
{
WorkbenchServiceFactory.OperationsService.AddTextToOutputWindowSync(fileName, text);
@ -74,11 +70,22 @@ namespace VisualPascalABC
fileName = Tools.FileNameToLower(fileName);
if (!RunTabs.ContainsKey(fileName))
{
string s = fileName + " ";
string s = "Closing: "+fileName + " \nRunTabs: ";
foreach (string ss in RunTabs.Keys)
s += ss + " ";
throw new Exception(s);
}
RunTabs[fileName].Run = false;
WorkbenchServiceFactory.DocumentService.SetTabPageText(RunTabs[fileName]);
if (ReadRequests.ContainsKey(RunTabs[fileName]))
ReadRequests.Remove(RunTabs[fileName]);
UpdateReadRequest(false);
WorkbenchServiceFactory.EditorService.SetFocusToEditor();
//if (TerminateAllPrograms)
WaitCallback_DeleteEXEAndPDB(fileName); // сделал всё синхронно - теперь WaitCallback_DeleteEXEAndPDB не должен работать медленно!
//else
// System.Threading.ThreadPool.QueueUserWorkItem(WaitCallback_DeleteEXEAndPDB, fileName); // в потоке - не синхронизировано! Надо запретить запускать что-то до окончания!
if (!ProjectFactory.Instance.ProjectLoaded)
{
if (Tools.FileNameToLower(WorkbenchServiceFactory.Workbench.CurrentEXEFileName) == fileName)
@ -89,17 +96,7 @@ namespace VisualPascalABC
else
{
ButtonsEnableDisable_RunStop();
}
RunTabs[fileName].Run = false;
WorkbenchServiceFactory.DocumentService.SetTabPageText(RunTabs[fileName]);
if (ReadRequests.ContainsKey(RunTabs[fileName]))
ReadRequests.Remove(RunTabs[fileName]);
UpdateReadRequest(false);
WorkbenchServiceFactory.EditorService.SetFocusToEditor();
if (TerminateAllPrograms)
WaitCallback_DeleteEXEAndPDB(fileName);
else
System.Threading.ThreadPool.QueueUserWorkItem(WaitCallback_DeleteEXEAndPDB, fileName);
} // SSM 22/04/19 - этот код перенесен в конец WaitCallback_DeleteEXEAndPDB - нет, там исключение
}
void RunnerManager_RunnerManagerUnhanledRuntimeException(string id, string ExceptionType, string ExceptionMessage, string StackTraceData, List<RunManager.StackTraceItem> StackTrace)
@ -152,21 +149,35 @@ namespace VisualPascalABC
void WaitCallback_DeleteEXEAndPDB(object state)
{
int i = 0;
//int i = 0;
string fileName = (string)state;
while (i < 20)
//while (i < 20) // 20 раз пытаться удалять! Это сильно!
//{
try
{
try
if (Workbench.UserOptions.DeleteEXEAfterExecute && File.Exists(fileName))
File.Delete(fileName);
}
catch
{
WorkbenchServiceFactory.OperationsService.AddTextToCompilerMessagesSync("Не удалось удалить EXE-файл");
}
try
{
if (Workbench.UserOptions.DeletePDBAfterExecute)
{
if (Workbench.UserOptions.DeleteEXEAfterExecute && File.Exists(fileName))
File.Delete(fileName);
if (Workbench.UserOptions.DeletePDBAfterExecute)
{
string pdbFileName = Path.ChangeExtension(fileName, ".pdb");
if (File.Exists(pdbFileName) && File.Exists(pdbFileName))
File.Delete(pdbFileName);
}
if (RunnerManager.TempBatFiles.ContainsKey(fileName))
string pdbFileName = Path.ChangeExtension(fileName, ".pdb");
if (File.Exists(pdbFileName))
File.Delete(pdbFileName);
}
}
catch
{
WorkbenchServiceFactory.OperationsService.AddTextToCompilerMessagesSync("Не удалось удалить PDB-файл");
}
try
{
if (RunnerManager.TempBatFiles.ContainsKey(fileName))
{
string batname = RunnerManager.TempBatFiles[fileName];
if (File.Exists(batname))
@ -175,14 +186,27 @@ namespace VisualPascalABC
RunnerManager.TempBatFiles.Remove(fileName);
}
}
return;
}
catch
{
}
System.Threading.Thread.Sleep(20);
i++;
}
catch
{
WorkbenchServiceFactory.OperationsService.AddTextToCompilerMessagesSync("Не удалось удалить bat-файл из словаря RunnerManager.TempBatFiles");
}
// SSM 22/04/19 - этот код перенесён сюда из RunnerManager_Exited_Sync - нет, тут исключение!
/*if (!ProjectFactory.Instance.ProjectLoaded)
{
if (Tools.FileNameToLower(WorkbenchServiceFactory.Workbench.CurrentEXEFileName) == fileName)
{
ButtonsEnableDisable_RunStop();
}
}
else
{
ButtonsEnableDisable_RunStop();
}*/
//return;
//System.Threading.Thread.Sleep(20);
//i++;
//}
}
void ReadStringRequest(string ForId)

View file

@ -242,7 +242,7 @@ type
/// Правый нижний угол графического объекта
property RightBottom: Point read Pnt(Left + Height,Top + Height);
/// Угол поворота графического объекта (по часовой стрелке)
property RotateAngle: real read InvokeReal(()->rot.Angle) write Invoke(procedure->rot.Angle := value);
property RotateAngle: real read InvokeReal(()->rot.Angle) write Invoke(procedure->begin rot.CenterX := Width/2; rot.CenterY := Height/2; rot.Angle := value end);
/// Множитель масштабирования объекта
property ScaleFactor: real read InvokeReal(()->sca.ScaleX) write Invoke(()->begin (sca.ScaleX, sca.ScaleY) := (value,value); end);
// Центр поворота графического объекта - запретил, т.к. это будет сбивать координаты объекта
@ -439,13 +439,24 @@ type
CircleWPF = class(BoundedObjectWPF)
private
procedure InitOb2(x,y,r: real; c: GColor) := InitOb1(x-r,y-r,2*r,2*r,c,new System.Windows.Shapes.Ellipse());
procedure WT(value: real) := (ob.Width,ob.Height) := (value,value);
procedure HT(value: real) := (ob.Width,ob.Height) := (value,value);
procedure WT(value: real) := begin (ob.Width,ob.Height) := (value,value); (gr.Width,gr.Height) := (value,value); end;
procedure HT(value: real) := begin (ob.Width,ob.Height) := (value,value); (gr.Width,gr.Height) := (value,value); end;
{procedure Rad(value: real);
begin
var delta := value - gr.Width/2;
Left -= delta;
Top -= delta;
(gr.Width,gr.Height) := (value*2,value*2);
Element.Points := ChangePointCollection(value,n);
end;}
procedure Rad(value: real);
begin
//(ob as Ellipse).RenderedGeometry
Left -= value - ob.Width/2;
Top -= value - ob.Width/2;
Left -= value - gr.Width/2;
Top -= value - gr.Width/2;
(gr.Width,gr.Height) := (value*2,value*2);
(ob.Width,ob.Height) := (value*2,value*2);
end;
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
@ -662,7 +673,7 @@ type
write Invoke(()->begin Self.Element.bc := value; Self.Element.RecreateFormText; ob.InvalidateVisual end);
/// Текст графического объекта
property Text: string read InvokeString(()->Element.Text)
write Invoke(procedure->begin Self.Element.Text := value; Self.Element.RecreateFormText; ; Width := Self.Element.Width; Height := Self.Element.Height; ob.InvalidateVisual end); override;
write Invoke(procedure->begin Self.Element.Text := value; Self.Element.RecreateFormText; Width := Self.Element.Width; Height := Self.Element.Height; ob.InvalidateVisual end); override;
/// Декоратор поворота объекта
function WithRotate(da: real): TextWPF := inherited WithRotate(da) as TextWPF;
end;