Browse Source

fix: 修复了部分电脑不能启动的问题

SongZihuan 5 months ago
parent
commit
4bdddf167c

+ 1 - 0
.gitignore

@@ -4,6 +4,7 @@ tmp
 cert
 data
 target
+fyne-cross
 
 *.exe
 *.out

+ 3 - 3
src/cmd/v1/FyneApp.toml → FyneApp.toml

@@ -1,11 +1,11 @@
 Website = "https://github.com/SuperH-0630"
 
 [Details]
-  Icon = "../../../assest/ico/app.ico"
+  Icon = "./assest/ico/app.ico"
   Name = "Huan档案"
   ID = "com.song-zh.hdangan"
-  Version = "1.0.1"
-  Build = 8
+  Version = "1.1.0"
+  Build = 13
 
 [LinuxAndBSD]
   GenericName = "Huan档案"

BIN
assest/xlsx/template.xlsx


+ 1 - 1
go.mod

@@ -1,6 +1,6 @@
 module github.com/SuperH-0630/hdangan
 
-go 1.22
+go 1.19
 
 require (
 	fyne.io/fyne/v2 v2.5.2

+ 8 - 6
ps/build/v1/build.ps1

@@ -1,7 +1,9 @@
 Write-Output Start building...
-IF (Test-Path ./target/build/Huan档案.exe) {
-    Remove-Item ./target/build/Huan档案.exe
-}
-fyne package --os windows --src ./src/cmd/v1
-Move-Item ./src/cmd/v1/Huan档案.exe ./target/build/Huan档案.exe
-Write-Output Finish
+
+fyne-cross windows -arch=amd64 -debug -image "fyneio/fyne-cross-images:1.1.3-windows" -developer "Zihuan Song" -name "Huan档案_x86_64.exe" ./src/cmd/v1
+
+IF ($?) {
+    Write-Output Success
+} ELSE {
+    Write-Output Fail
+}

+ 9 - 0
ps/build/v1/build_x32.ps1

@@ -0,0 +1,9 @@
+Write-Output Start building...
+
+fyne-cross windows -arch=386 -debug -image="fyneio/fyne-cross-images:1.1.3-windows" -developer="Zihuan Song" -dir . -name="Huan档案_x368_debug.exe" ./src/cmd/v1
+
+IF ($?) {
+    Write-Output Success
+} ELSE {
+    Write-Output Fail
+}

+ 8 - 6
ps/release/v1/build.ps1

@@ -1,7 +1,9 @@
 Write-Output Start building release...
-IF (Test-Path ./target/release/Huan档案.exe) {
-    Remove-Item ./target/release/Huan档案.exe
-}
-fyne package --os windows --src ./src/cmd/v1 --release
-Move-Item ./src/cmd/v1/Huan档案.exe ./target/release/Huan档案.exe
-Write-Output Finish
+
+fyne-cross windows -arch=amd64 -image="fyneio/fyne-cross-images:1.1.3-windows" -developer="Zihuan Song" -dir . -name="Huan档案_x86_64.exe" ./src/cmd/v1
+
+IF ($?) {
+    Write-Output Success
+} ELSE {
+    Write-Output Fail
+}

+ 9 - 0
ps/release/v1/build_x32.ps1

@@ -0,0 +1,9 @@
+Write-Output Start building release...
+
+fyne-cross windows -arch=386 -image="fyneio/fyne-cross-images:1.1.3-windows" -developer="Zihuan Song" -dir . -name="Huan档案_x368.exe" ./src/cmd/v1
+
+IF ($?) {
+    Write-Output Success
+} ELSE {
+    Write-Output Fail
+}

+ 4 - 1
src/app/app.go

@@ -11,9 +11,12 @@ type App struct {
 }
 
 func NewApp() *App {
-	return &App{
+	res := &App{
 		App: app.NewWithID("com.song-zh.hdangan"),
 	}
+
+	res.App.SetIcon(assest.MainIco)
+	return res
 }
 
 func (app *App) NewWindow(title string) fyne.Window {

File diff suppressed because it is too large
+ 10 - 0
src/assest/templatexlsx.go


+ 3 - 39
src/excelreader/reader.go

@@ -3,6 +3,7 @@ package excelreader
 import (
 	"database/sql"
 	"fmt"
+	"github.com/SuperH-0630/hdangan/src/assest"
 	"github.com/SuperH-0630/hdangan/src/model"
 	"github.com/SuperH-0630/hdangan/src/runtime"
 	"github.com/SuperH-0630/hdangan/src/systeminit"
@@ -120,48 +121,11 @@ const (
 	fail
 )
 
-func CreateTemplate(rt runtime.RunTime, savepath string) error {
-	var err error
-
-	f := excelize.NewFile()
-	defer func() {
-		_ = f.Close()
-	}()
-
-	sheetIndex := 0
-	sheetName := "sheet1"
-	slts := f.GetSheetList()
-	if len(slts) == 0 {
-		sheetIndex, err = f.NewSheet(sheetName)
-		if err != nil {
-			return err
-		}
-		f.SetActiveSheet(sheetIndex)
-	}
-
-	f.SetActiveSheet(sheetIndex)
-
-	for i, k := range Title {
-		err = f.SetCellStr(sheetName, fmt.Sprintf("%s1", Header[i]), k)
-		if err != nil {
-			return err
-		}
-	}
-
-	styleId, err := f.NewStyle(&excelize.Style{})
-	if err != nil {
-		return err
-	}
-
-	_ = f.SetColStyle(sheetName, Header[7], styleId)
-	_ = f.SetColStyle(sheetName, Header[8], styleId)
-	_ = f.SetColStyle(sheetName, Header[10], styleId)
-
-	err = f.SaveAs(savepath)
+func CreateTemplate(rt runtime.RunTime, writer io.Writer) error {
+	_, err := writer.Write(assest.TemplateXlsx.Content())
 	if err != nil {
 		return err
 	}
-
 	return nil
 }
 

+ 0 - 40
src/fail/fail.go

@@ -1,40 +0,0 @@
-package fail
-
-import (
-	"errors"
-	"fmt"
-	"fyne.io/fyne/v2"
-	"fyne.io/fyne/v2/app"
-	"fyne.io/fyne/v2/widget"
-	"github.com/SuperH-0630/hdangan/src/systeminit"
-	"os"
-)
-
-func ToFail(res string) {
-	a := app.New()
-
-	w1 := a.NewWindow("Error")
-
-	w1.Resize(fyne.NewSize(300, 300))
-	w1.SetMaster()
-
-	l1 := widget.NewLabel("")
-	w1.SetContent(l1)
-
-	var msg string
-	d, err := systeminit.GetInit()
-	if errors.Is(err, systeminit.LuckyError) {
-		msg = err.Error()
-	} else if err == nil {
-		msg = fmt.Sprintf("I am sorry, that we has miss some wrong.\n%s\n\n\n寻求帮助:%s <%s>", res, d.Yaml.Report.Name, d.Yaml.Report.Email)
-	} else {
-		msg = fmt.Sprintf("I am sorry, that we has miss some wrong.\n%s", res)
-	}
-
-	l1.SetText(msg)
-
-	w1.Show()
-	a.Run()
-
-	os.Exit(1)
-}

+ 10 - 1
src/v1main/bg.go

@@ -35,5 +35,14 @@ func (b *Bg) MinSize() fyne.Size {
 func (b *Bg) Size() fyne.Size {
 	mSize := b.MinSize()
 	size := b.Text.Size()
-	return fyne.NewSize(max(mSize.Width, size.Width), max(mSize.Height, size.Height))
+	return fyne.NewSize(fmax(mSize.Width, size.Width), fmax(mSize.Height, size.Height))
+}
+
+func fmax(a float32, b ...float32) float32 {
+	for _, v := range b {
+		if v > a {
+			a = v
+		}
+	}
+	return a
 }

+ 34 - 47
src/v1main/ctrl.go

@@ -3,21 +3,22 @@ package v1main
 import (
 	"fyne.io/fyne/v2"
 	"fyne.io/fyne/v2/container"
-	"github.com/SuperH-0630/hdangan/src/fail"
 	"github.com/SuperH-0630/hdangan/src/runtime"
 	"time"
 )
 
-type window fyne.Window
-
 type CtrlWindow struct {
-	window
+	window   fyne.Window
 	lastUse  time.Time
 	killTime time.Duration
 	rt       runtime.RunTime
+	menu     *MainMenu
+	table    *MainTable
 }
 
-func NewWindow(rt runtime.RunTime, title string, killSecond time.Duration) *CtrlWindow {
+var ctrlWindow *CtrlWindow
+
+func newWindow(rt runtime.RunTime, title string, killSecond time.Duration) *CtrlWindow {
 	ks := killSecond * time.Second
 	cw := &CtrlWindow{
 		window:   rt.App().NewWindow(title),
@@ -27,13 +28,14 @@ func NewWindow(rt runtime.RunTime, title string, killSecond time.Duration) *Ctrl
 	}
 
 	cw.window.SetOnClosed(func() {
-		rt.Action()
-		WinClose(cw.window)
+		ctrlWindow = nil
+		ShowHelloWindow(rt)
 	})
 
 	cw.window.SetCloseIntercept(func() {
-		rt.Action()
-		WinClose(cw.window)
+		WinClose(ctrlWindow.window)
+		ctrlWindow = nil
+		ShowHelloWindow(rt)
 	})
 
 	return cw
@@ -55,7 +57,7 @@ func (w *CtrlWindow) Hide() {
 }
 
 func (w *CtrlWindow) Action() {
-	if w.window == nil {
+	if w == nil || w.window == nil {
 		return
 	}
 	w.lastUse = time.Now()
@@ -69,73 +71,58 @@ func (w *CtrlWindow) cc() {
 			}
 
 			if time.Now().Sub(w.lastUse) > w.killTime {
-				ShowHelloWindowTimeout(rt)
-				HideCtrlWindow(rt)
+				err := HideCtrlWindow(rt) // 强行关闭
+				if err == nil {
+					ShowHelloWindowTimeout(rt)
+				}
 				return
 			}
 		}
 	}(w.rt, w)
 }
 
-var ctrlWindow *CtrlWindow
-
-func onClose(rt runtime.RunTime) {
-	if ctrlWindow == nil {
-		return
-	}
-
-	WinClose(ctrlWindow)
-	ctrlWindow = nil
-	ShowHelloWindow(rt)
-}
-
 func createCtrlWindow(rt runtime.RunTime) error {
 	if ctrlWindow != nil {
 		return nil
 	}
 
-	ctrlWindow = NewWindow(rt, "桓档案-控制中心", 15*60)
-	rt.SetDBConnectErrorWindow(ctrlWindow)
+	ctrlWindow = newWindow(rt, "桓档案-控制中心", 15*60)
+	rt.SetDBConnectErrorWindow(ctrlWindow.window)
 	rt.SetAction(func() {
 		ctrlWindow.Action()
 	})
 
-	ctrlWindow.SetMainMenu(getMainMenu(rt, ctrlWindow, func(rt runtime.RunTime) {
-		UpdateTable(rt, ctrlWindow, fileTable, 0, NowPage)
-	}))
+	ctrlWindow.menu = getMainMenu(rt, ctrlWindow, func(rt runtime.RunTime) {
+		ctrlWindow.table.UpdateTable(rt, 0, ctrlWindow.menu.NowPage)
+	})
+	ctrlWindow.window.SetMainMenu(ctrlWindow.menu.Main)
 
-	CreateInfoTable(rt, ctrlWindow)
+	ctrlWindow.table = CreateInfoTable(rt, ctrlWindow)
 
-	bg := NewBg(max(fileTable.MinSize().Width, fileTable.Size().Width, 800),
-		max(fileTable.MinSize().Height, fileTable.Size().Height, 500))
+	bg := NewBg(fmax(ctrlWindow.table.fileTable.MinSize().Width, ctrlWindow.table.fileTable.Size().Width, 800),
+		fmax(ctrlWindow.table.fileTable.MinSize().Height, ctrlWindow.table.fileTable.Size().Height, 500))
 
-	lastContainer := container.NewStack(bg, fileTable)
-	ctrlWindow.SetContent(lastContainer)
+	lastContainer := container.NewStack(bg, ctrlWindow.table.fileTable)
+	ctrlWindow.window.SetContent(lastContainer)
 
-	ctrlWindow.SetOnClosed(func() {
-		onClose(rt)
-	})
-	ctrlWindow.SetCloseIntercept(func() {
-		onClose(rt)
-	})
 	return nil
 }
 
-func ShowCtrlWindow(rt runtime.RunTime) {
+func ShowCtrlWindow(rt runtime.RunTime) error {
 	err := createCtrlWindow(rt)
 	if err != nil {
-		fail.ToFail("非常抱歉,数据加载失败。")
-		return
+		return err
 	}
 	ctrlWindow.Show()
-	ctrlWindow.CenterOnScreen()
+	ctrlWindow.window.CenterOnScreen()
+	return err
 }
 
-func HideCtrlWindow(rt runtime.RunTime) {
+func HideCtrlWindow(rt runtime.RunTime) error {
 	err := createCtrlWindow(rt)
 	if err != nil {
-		fail.ToFail("非常抱歉,数据加载失败。")
-		return
+		return err
 	}
 	ctrlWindow.Hide()
+	return nil
 }

+ 68 - 68
src/v1main/ctrlmainmenu.go

@@ -4,7 +4,6 @@ import (
 	"fmt"
 	"fyne.io/fyne/v2"
 	"fyne.io/fyne/v2/dialog"
-	"fyne.io/fyne/v2/widget"
 	"github.com/SuperH-0630/hdangan/src/aboutme"
 	"github.com/SuperH-0630/hdangan/src/excelreader"
 	"github.com/SuperH-0630/hdangan/src/model"
@@ -13,52 +12,56 @@ import (
 	"strings"
 )
 
-var Menu *fyne.MainMenu
-var Page *fyne.Menu
-var NowPage int64 = 0
-
-func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunTime)) *fyne.MainMenu {
-	if Menu != nil {
-		return Menu
-	}
+type MainMenu struct {
+	Window  *CtrlWindow
+	Main    *fyne.MainMenu
+	Page    *fyne.Menu
+	NowPage int64
+}
 
+func getMainMenu(rt runtime.RunTime, w *CtrlWindow, refresh func(rt runtime.RunTime)) *MainMenu {
 	lucky := fyne.NewMenuItem("启动/关闭彩蛋", func() {
 		rt.Action()
 		res := ChangeGame(rt)
 		if res == TurnOn {
-			dialog.ShowInformation("提示", "彩蛋已经触发。", w)
+			dialog.ShowInformation("提示", "彩蛋已经触发。", w.window)
 		} else {
-			dialog.ShowInformation("提示", "彩蛋已经关闭。", w)
+			dialog.ShowInformation("提示", "彩蛋已经关闭。", w.window)
 		}
 	})
 
+	wm := &MainMenu{
+		Window:  w,
+		NowPage: 1,
+	}
+
 	search := fyne.NewMenuItem("搜索条件", func() {
 		rt.Action()
-		ShowWhereWindow(rt, &whereInfo, refresh)
+		ShowWhereWindow(rt, &wm.Window.table.whereInfo, refresh)
 	})
 
 	initFile := fyne.NewMenuItem("导入配置文件", func() {
 		rt.Action()
-		NewInitFile(rt, w)
+		NewInitFile(rt, w.window)
 	})
 
 	openFile := fyne.NewMenuItem("打开配置文件", func() {
 		rt.Action()
-		OpenInit(rt, w)
+		OpenInit(rt, w.window)
 	})
 
 	saveFile := fyne.NewMenuItem("另存配置文件", func() {
 		rt.Action()
-		SaveInit(rt, w)
+		SaveInit(rt, w.window)
 	})
 
 	copyFile := fyne.NewMenuItem("复制配置文件", func() {
 		rt.Action()
-		CopyInit(rt, w)
+		CopyInit(rt, w.window)
 	})
 
 	aboutMe := fyne.NewMenuItem("关于", func() {
-		dialog.ShowInformation("关于开发者", aboutme.AboutMe, w)
+		dialog.ShowInformation("关于开发者", aboutme.AboutMe, w.window)
 		rt.Action()
 	})
 
@@ -75,9 +78,9 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 
 	exclFile := fyne.NewMenuItem("模板导入", func() {
 		rt.Action()
-		err := AddFromFile(rt, w, refresh)
+		err := AddFromFile(rt, w.window, refresh)
 		if err != nil {
-			dialog.ShowError(fmt.Errorf("导入失败:%s", err.Error()), w)
+			dialog.ShowError(fmt.Errorf("导入失败:%s", err.Error()), w.window)
 		}
 	})
 
@@ -87,7 +90,7 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 			if writer == nil {
 				return
 			} else if err != nil {
-				dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w)
+				dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w.window)
 				return
 			}
 
@@ -95,17 +98,15 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 				_ = writer.Close()
 			}()
 
-			savepath := writer.URI().Path()
-
-			if !strings.HasSuffix(savepath, ".xlsx") {
-				dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w)
+			if !strings.HasSuffix(writer.URI().Path(), ".xlsx") {
+				dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w.window)
 			}
 
-			err = excelreader.CreateTemplate(rt, savepath)
+			err = excelreader.CreateTemplate(rt, writer)
 			if err != nil {
-				dialog.ShowError(fmt.Errorf("模板保存失败:%s", err), w)
+				dialog.ShowError(fmt.Errorf("模板保存失败:%s", err), w.window)
 			}
-		}, w)
+		}, w.window)
 
 		dlg.SetFileName("template.xlsx")
 		dlg.Show()
@@ -113,7 +114,7 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 
 	tj := fyne.NewMenuItem("数据统计", func() {
 		rt.Action()
-		TongJi(rt, w)
+		TongJi(rt, w.window)
 	})
 
 	outputAll := fyne.NewMenuItem("导出全部档案", func() {
@@ -122,7 +123,7 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 			if writer == nil {
 				return
 			} else if err != nil {
-				dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w)
+				dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w.window)
 				return
 			}
 
@@ -133,16 +134,16 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 			savepath := writer.URI().Path()
 
 			if !strings.HasSuffix(savepath, ".xlsx") {
-				dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w)
+				dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w.window)
 			}
 
 			err = excelreader.OutputFile(rt, savepath, []model.File{}, nil)
 			if err != nil {
-				dialog.ShowError(fmt.Errorf("生成数据库遇到错误:%s", err), w)
+				dialog.ShowError(fmt.Errorf("生成数据库遇到错误:%s", err), w.window)
 			} else {
-				dialog.ShowInformation("完成", fmt.Sprintf("你的数据已被保存在 %s ..", savepath), w)
+				dialog.ShowInformation("完成", fmt.Sprintf("你的数据已被保存在 %s ..", savepath), w.window)
 			}
-		}, w)
+		}, w.window)
 
 		dlg.SetFileName("all_data.xlsx")
 		dlg.Show()
@@ -154,7 +155,7 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 			if writer == nil {
 				return
 			} else if err != nil {
-				dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w)
+				dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w.window)
 				return
 			}
 
@@ -165,16 +166,16 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 			savepath := writer.URI().Path()
 
 			if !strings.HasSuffix(savepath, ".xlsx") {
-				dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w)
+				dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w.window)
 			}
 
-			err = excelreader.OutputFile(rt, savepath, []model.File{}, &whereInfo)
+			err = excelreader.OutputFile(rt, savepath, []model.File{}, &wm.Window.table.whereInfo)
 			if err != nil {
-				dialog.ShowError(fmt.Errorf("生成数据库遇到错误:%s", err), w)
+				dialog.ShowError(fmt.Errorf("生成数据库遇到错误:%s", err), w.window)
 			} else {
-				dialog.ShowInformation("完成", fmt.Sprintf("你的数据已被保存在 %s ..", savepath), w)
+				dialog.ShowInformation("完成", fmt.Sprintf("你的数据已被保存在 %s ..", savepath), w.window)
 			}
-		}, w)
+		}, w.window)
 
 		dlg.SetFileName("all_data_with_condition.xlsx")
 		dlg.Show()
@@ -186,7 +187,7 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 			if writer == nil {
 				return
 			} else if err != nil {
-				dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w)
+				dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w.window)
 				return
 			}
 
@@ -197,16 +198,16 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 			savepath := writer.URI().Path()
 
 			if !strings.HasSuffix(savepath, ".xlsx") {
-				dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w)
+				dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w.window)
 			}
 
-			err = excelreader.OutputFile(rt, savepath, InfoFile, nil)
+			err = excelreader.OutputFile(rt, savepath, wm.Window.table.InfoFile, nil)
 			if err != nil {
-				dialog.ShowError(fmt.Errorf("生成数据库遇到错误:%s", err), w)
+				dialog.ShowError(fmt.Errorf("生成数据库遇到错误:%s", err), w.window)
 			} else {
-				dialog.ShowInformation("完成", fmt.Sprintf("你的数据已被保存在 %s ..", savepath), w)
+				dialog.ShowInformation("完成", fmt.Sprintf("你的数据已被保存在 %s ..", savepath), w.window)
 			}
-		}, w)
+		}, w.window)
 
 		dlg.SetFileName("one_page_of_data.xlsx")
 		dlg.Show()
@@ -218,7 +219,7 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 			if writer == nil {
 				return
 			} else if err != nil {
-				dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w)
+				dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w.window)
 				return
 			}
 
@@ -229,16 +230,16 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 			savepath := writer.URI().Path()
 
 			if !strings.HasSuffix(savepath, ".xlsx") {
-				dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w)
+				dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w.window)
 			}
 
 			err = excelreader.OutputFileRecord(rt, savepath, nil, nil, nil)
 			if err != nil {
-				dialog.ShowError(fmt.Errorf("生成数据库遇到错误:%s", err), w)
+				dialog.ShowError(fmt.Errorf("生成数据库遇到错误:%s", err), w.window)
 			} else {
-				dialog.ShowInformation("完成", fmt.Sprintf("你的数据已被保存在 %s ..", savepath), w)
+				dialog.ShowInformation("完成", fmt.Sprintf("你的数据已被保存在 %s ..", savepath), w.window)
 			}
-		}, w)
+		}, w.window)
 
 		dlg.SetFileName("all_record_data.xlsx")
 		dlg.Show()
@@ -251,7 +252,7 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 				if writer == nil {
 					return
 				} else if err != nil {
-					dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w)
+					dialog.ShowError(fmt.Errorf("选择框遇到错误:%s", err.Error()), w.window)
 					return
 				}
 
@@ -262,16 +263,16 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 				savepath := writer.URI().Path()
 
 				if !strings.HasSuffix(savepath, ".xlsx") {
-					dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w)
+					dialog.ShowError(fmt.Errorf("文件名必须以.xlsx结尾"), w.window)
 				}
 
 				err = excelreader.OutputFileRecord(rt, savepath, nil, nil, &s.SearchRecord)
 				if err != nil {
-					dialog.ShowError(fmt.Errorf("生成数据库遇到错误:%s", err), w)
+					dialog.ShowError(fmt.Errorf("生成数据库遇到错误:%s", err), w.window)
 				} else {
-					dialog.ShowInformation("完成", fmt.Sprintf("你的数据已被保存在 %s ..", savepath), w)
+					dialog.ShowInformation("完成", fmt.Sprintf("你的数据已被保存在 %s ..", savepath), w.window)
 				}
-			}, w)
+			}, w.window)
 
 			dlg.SetFileName("all_record_data_with_condition.xlsx")
 			dlg.Show()
@@ -282,27 +283,26 @@ func getMainMenu(rt runtime.RunTime, w fyne.Window, refresh func(rt runtime.RunT
 	xitong := fyne.NewMenu("系统", newFile, exclFile, template, aboutMe, quit)
 	peizhi := fyne.NewMenu("配置", initFile, openFile, saveFile, copyFile)
 	sousuo := fyne.NewMenu("搜索", search)
-	Page = fyne.NewMenu("分页")
+	wm.Page = fyne.NewMenu("分页")
 	tongji := fyne.NewMenu("统计", tj, outputAll, outputAllWthSearch, outputNow, outputAllEveryOne, outputAllWthSearchEveryOne)
 	caidan := fyne.NewMenu("彩蛋", lucky)
 
-	menu := fyne.NewMainMenu(xitong, peizhi, sousuo, Page, tongji, caidan)
-
-	return menu
+	wm.Main = fyne.NewMainMenu(xitong, peizhi, sousuo, wm.Page, tongji, caidan)
+	return wm
 }
 
-func ChangePageMenuItem(rt runtime.RunTime, window fyne.Window, table *widget.Table, pageItemCount int, p int64, pageMax int64, message string) {
+func (m *MainMenu) ChangePageMenuItem(rt runtime.RunTime, pageItemCount int, p int64, pageMax int64, message string) {
 	pageList := make([]*fyne.MenuItem, 0, pageMax)
 	if pageMax <= 0 {
 		pageList = append(pageList, fyne.NewMenuItem("暂无数据", func() {
 			rt.Action()
 		}))
-		NowPage = 0
+		m.NowPage = 0
 	} else {
 		if p > pageMax {
 			p = pageMax
 		}
-		NowPage = p
+		m.NowPage = p
 		for k := int64(1); k <= pageMax; k++ {
 			i := k
 			if i == p {
@@ -313,20 +313,20 @@ func ChangePageMenuItem(rt runtime.RunTime, window fyne.Window, table *widget.Ta
 						if !b {
 							return
 						}
-						UpdateTable(rt, window, table, pageItemCount, i)
-					}, window)
+						m.Window.table.UpdateTable(rt, pageItemCount, i)
+					}, m.Window.window)
 				})
 				pageList = append(pageList, m)
 			} else {
 				pageList = append(pageList, fyne.NewMenuItem(fmt.Sprintf("第%d页", i), func() {
 					rt.Action()
-					UpdateTable(rt, window, table, pageItemCount, i)
+					m.Window.table.UpdateTable(rt, pageItemCount, i)
 				}))
 			}
 		}
 	}
 
-	Page.Items = pageList
-	Page.Refresh()
-	Menu.Refresh()
+	m.Page.Items = pageList
+	m.Page.Refresh()
+	m.Main.Refresh()
 }

+ 29 - 12
src/v1main/edit.go

@@ -9,7 +9,6 @@ import (
 	"fyne.io/fyne/v2/dialog"
 	"fyne.io/fyne/v2/layout"
 	"fyne.io/fyne/v2/widget"
-	"github.com/SuperH-0630/hdangan/src/fail"
 	"github.com/SuperH-0630/hdangan/src/model"
 	"github.com/SuperH-0630/hdangan/src/runtime"
 	"github.com/SuperH-0630/hdangan/src/systeminit"
@@ -19,7 +18,10 @@ import (
 func ShowEdit(rt runtime.RunTime, f *model.File, refresh func(rt runtime.RunTime)) {
 	config, err := systeminit.GetInit()
 	if errors.Is(err, systeminit.LuckyError) {
-		fail.ToFail(err.Error())
+		rt.DBConnectError(err)
+		return
+	} else if err != nil {
+		rt.DBConnectError(fmt.Errorf("配置文件错误,请检查配置文件状态。"))
 		return
 	}
 
@@ -27,7 +29,6 @@ func ShowEdit(rt runtime.RunTime, f *model.File, refresh func(rt runtime.RunTime
 
 	infoWindow.SetOnClosed(func() {
 		rt.Action()
-		WinClose(infoWindow)
 		infoWindow = nil
 	})
 	infoWindow.SetCloseIntercept(func() {
@@ -46,7 +47,7 @@ func ShowEdit(rt runtime.RunTime, f *model.File, refresh func(rt runtime.RunTime
 	leftLayout := layout.NewFormLayout()
 	left := container.New(leftLayout,
 		widget.NewLabel("卷宗号:"),
-		newFileIDEntry(fmt.Sprintf("%d", f.FileID), &f.FileID),
+		newFileIDEntry(f.FileID, &f.FileID),
 
 		widget.NewLabel("姓名:"),
 		newEntry(fmt.Sprintf("%s", f.Name), &f.Name),
@@ -110,13 +111,14 @@ func ShowEdit(rt runtime.RunTime, f *model.File, refresh func(rt runtime.RunTime
 	box := container.NewVBox(upBox, gg, downCenterBox)
 	cbox := container.NewCenter(box)
 
-	bg := NewBg(max(cbox.MinSize().Width, cbox.Size().Width, 220),
-		max(cbox.MinSize().Height, cbox.Size().Height, 360))
+	bg := NewBg(fmax(cbox.MinSize().Width, cbox.Size().Width, 220),
+		fmax(cbox.MinSize().Height, cbox.Size().Height, 360))
 
 	lastContainer := container.NewStack(bg, cbox)
 
 	infoWindow.SetContent(lastContainer)
 
+	infoWindow.SetFixedSize(true)
 	infoWindow.Show()
 	infoWindow.CenterOnScreen()
 }
@@ -137,11 +139,20 @@ func newEntry(data string, input *string) *widget.Entry {
 	return entry
 }
 
-func newFileIDEntry(data string, input *int64) *widget.Entry {
+func newFileIDEntry(data int64, input *int64) *widget.Entry {
 	entry := widget.NewEntry()
-	entry.Text = data
+	if data <= 0 {
+		entry.Text = ""
+	} else {
+		entry.Text = fmt.Sprintf("%d", data)
+	}
+
 	entry.Validator = func(s string) error {
-		n, err := strconv.ParseInt(s, 0, 64)
+		if len(s) == 0 {
+			return nil
+		}
+
+		n, err := strconv.ParseInt(s, 10, 64)
 		if err != nil {
 			return err
 		}
@@ -155,9 +166,15 @@ func newFileIDEntry(data string, input *int64) *widget.Entry {
 
 	entry.OnChanged = func(s string) {
 		if entry.Validate() == nil {
-			n, err := strconv.ParseInt(s, 64, 10)
-			if err == nil {
-				*input = n
+			if len(s) == 0 {
+				*input = 0
+			} else {
+				n, err := strconv.ParseInt(s, 10, 64)
+				if err == nil {
+					*input = n
+				} else {
+					*input = 0
+				}
 			}
 		}
 	}

+ 22 - 5
src/v1main/hello.go

@@ -1,6 +1,7 @@
 package v1main
 
 import (
+	"fmt"
 	"fyne.io/fyne/v2"
 	"fyne.io/fyne/v2/canvas"
 	"fyne.io/fyne/v2/container"
@@ -14,9 +15,15 @@ import (
 
 var helloWindow fyne.Window
 
-func startBtnClick(rt runtime.RunTime) {
-	ShowCtrlWindow(rt)
+func startBtnClick(rt runtime.RunTime) error {
+	err := ShowCtrlWindow(rt)
+	if err != nil {
+		dialog.ShowError(fmt.Errorf("无法启动: %s", err.Error()), helloWindow)
+		return err
+	}
+
 	HideHelloWindow(rt)
+	return nil
 }
 
 func createHelloWindow(rt runtime.RunTime) {
@@ -41,7 +48,7 @@ func createHelloWindow(rt runtime.RunTime) {
 	welcomeStrContainerWithSpace := container.New(wboader, welcomeStrContainer)
 
 	startBtn := widget.NewButton("立刻进入", func() {
-		startBtnClick(rt)
+		_ = startBtnClick(rt)
 	})
 	startBtn.SetIcon(assest.MainIco)
 	startBtn.Resize(fyne.NewSize(200, startBtn.MinSize().Height))
@@ -59,13 +66,23 @@ func createHelloWindow(rt runtime.RunTime) {
 	boader := layout.NewBorderLayout(bTop, bBottom, nil, nil)
 	welcomeStrWithBottonWithBoader := container.New(boader, welcomeStrWithBottonAsCenter)
 
-	bg := NewBg(max(welcomeStrWithBottonWithBoader.MinSize().Width, welcomeStrWithBottonWithBoader.Size().Width, 350),
-		max(welcomeStrWithBottonWithBoader.MinSize().Height, welcomeStrWithBottonWithBoader.Size().Height, 200))
+	bg := NewBg(fmax(welcomeStrWithBottonWithBoader.MinSize().Width, welcomeStrWithBottonWithBoader.Size().Width, 350),
+		fmax(welcomeStrWithBottonWithBoader.MinSize().Height, welcomeStrWithBottonWithBoader.Size().Height, 200))
 
 	lowerContainer := container.NewStack(pic, bg, welcomeStrWithBottonWithBoader)
 
 	helloWindow.SetContent(lowerContainer)
 	helloWindow.SetMaster()
+	helloWindow.SetFixedSize(true)
+
+	helloWindow.SetOnClosed(func() {
+		rt.App().Quit()
+	})
+
+	helloWindow.SetCloseIntercept(func() {
+		helloWindow.Close()
+		rt.App().Quit()
+	})
 }
 
 func ShowHelloWindow(rt runtime.RunTime) {

+ 3 - 3
src/v1main/info.go

@@ -81,7 +81,6 @@ func ShowInfo(rt runtime.RunTime, f *model.File, refresh func(rt runtime.RunTime
 
 	infoWindow.SetOnClosed(func() {
 		rt.Action()
-		WinClose(infoWindow)
 		infoWindow = nil
 	})
 	infoWindow.SetCloseIntercept(func() {
@@ -142,12 +141,13 @@ func ShowInfo(rt runtime.RunTime, f *model.File, refresh func(rt runtime.RunTime
 	box := container.NewVBox(upBox, gg, downCenterBox)
 	cbox := container.NewCenter(box)
 
-	bg := NewBg(max(cbox.MinSize().Width, cbox.Size().Width, 400),
-		max(cbox.MinSize().Height, cbox.Size().Height, 350))
+	bg := NewBg(fmax(cbox.MinSize().Width, cbox.Size().Width, 400),
+		fmax(cbox.MinSize().Height, cbox.Size().Height, 350))
 
 	lastContainer := container.NewStack(bg, cbox)
 	infoWindow.SetContent(lastContainer)
 
 	infoWindow.Show()
 	infoWindow.CenterOnScreen()
+	infoWindow.SetFixedSize(true)
 }

+ 33 - 29
src/v1main/infotable.go

@@ -10,10 +10,6 @@ import (
 	"github.com/SuperH-0630/hdangan/src/runtime"
 )
 
-var InfoFile []model.File
-var InfoData = make([][]string, 0, 0)
-var whereInfo = model.SearchWhere{}
-
 var TopHeaderData = []string{"卷宗号", "姓名", "身份证", "户籍地", "卷宗标题", "卷宗类型", "最早迁入时间", "最后迁入(归还)时间", "迁入迁出状态", "迁出人姓名", "迁出人工作单位", "详情"}
 var xiangQingIndex = -1
 
@@ -29,17 +25,19 @@ func init() {
 	}
 }
 
-var fileTable *widget.Table
-
-func CreateInfoTable(rt runtime.RunTime, window fyne.Window) {
-	if fileTable != nil {
-		return
-	}
+type MainTable struct {
+	fileTable *widget.Table
+	window    *CtrlWindow
+	InfoFile  []model.File
+	InfoData  [][]string
+	whereInfo model.SearchWhere
+}
 
+func CreateInfoTable(rt runtime.RunTime, window *CtrlWindow) *MainTable {
 	var width = make([]float32, 12)
 	var idWidth float32 = 0
 
-	fileTable = widget.NewTableWithHeaders(
+	fileTable := widget.NewTableWithHeaders(
 		func() (rows int, cols int) {
 			return 0, 0
 		},
@@ -49,8 +47,13 @@ func CreateInfoTable(rt runtime.RunTime, window fyne.Window) {
 
 		})
 
+	m := &MainTable{
+		fileTable: fileTable,
+		window:    ctrlWindow,
+	}
+
 	fileTable.Length = func() (rows int, cols int) {
-		return len(InfoData), len(TopHeaderData)
+		return len(m.InfoData), len(TopHeaderData)
 	}
 
 	fileTable.CreateCell = func() fyne.CanvasObject {
@@ -59,8 +62,8 @@ func CreateInfoTable(rt runtime.RunTime, window fyne.Window) {
 
 	fileTable.UpdateCell = func(id widget.TableCellID, object fyne.CanvasObject) {
 		l := object.(*widget.Label)
-		l.SetText(InfoData[id.Row][id.Col])
-		width[id.Col] = max(width[id.Col], l.Size().Width, l.MinSize().Width)
+		l.SetText(m.InfoData[id.Row][id.Col])
+		width[id.Col] = fmax(width[id.Col], l.Size().Width, l.MinSize().Width)
 		fileTable.SetColumnWidth(id.Col, width[id.Col])
 	}
 
@@ -72,12 +75,12 @@ func CreateInfoTable(rt runtime.RunTime, window fyne.Window) {
 		if id.Row == -1 {
 			l := template.(*widget.Label)
 			l.SetText(TopHeaderData[id.Col])
-			width[id.Col] = max(width[id.Col], l.Size().Width, l.MinSize().Width)
+			width[id.Col] = fmax(width[id.Col], l.Size().Width, l.MinSize().Width)
 			fileTable.SetColumnWidth(id.Col, width[id.Col])
 		} else if id.Col == -1 {
 			l := template.(*widget.Label)
 			l.SetText(fmt.Sprintf("%02d", id.Row+1)) // 从1开始
-			idWidth = max(idWidth, l.Size().Width, l.MinSize().Width)
+			idWidth = fmax(idWidth, l.Size().Width, l.MinSize().Width)
 			fileTable.SetColumnWidth(-1, idWidth)
 		}
 	}
@@ -85,10 +88,10 @@ func CreateInfoTable(rt runtime.RunTime, window fyne.Window) {
 	fileTable.OnSelected = func(id widget.TableCellID) {
 		rt.Action()
 		if id.Col == xiangQingIndex {
-			if id.Row >= 0 && id.Row < len(InfoFile) {
-				file := InfoFile[id.Row]
+			if id.Row >= 0 && id.Row < len(m.InfoData) {
+				file := m.InfoFile[id.Row]
 				ShowInfo(rt, &file, func(rt runtime.RunTime) {
-					UpdateTable(rt, window, fileTable, 0, NowPage)
+					m.UpdateTable(rt, 0, window.menu.NowPage)
 				})
 			}
 		}
@@ -99,10 +102,11 @@ func CreateInfoTable(rt runtime.RunTime, window fyne.Window) {
 		rt.Action()
 	}
 
-	UpdateTable(rt, window, fileTable, 0, 1)
+	m.UpdateTable(rt, 0, 1)
+	return m
 }
 
-func UpdateTableInfo(rt runtime.RunTime, files []model.File) {
+func (m *MainTable) UpdateTableInfo(rt runtime.RunTime, files []model.File) {
 	res := make([][]string, len(files))
 
 	for i, f := range files {
@@ -122,25 +126,25 @@ func UpdateTableInfo(rt runtime.RunTime, files []model.File) {
 		res[i][11] = "点击查看"
 	}
 
-	InfoData = res
+	m.InfoData = res
 }
 
-func UpdateTable(rt runtime.RunTime, window fyne.Window, table *widget.Table, pageItemCount int, p int64) {
+func (m *MainTable) UpdateTable(rt runtime.RunTime, pageItemCount int, p int64) {
 	if pageItemCount <= 0 {
 		pageItemCount = defaultItemCount
 	}
 
-	files, pageMax, err := model.GetPageData(rt, pageItemCount, p, &whereInfo)
+	files, pageMax, err := model.GetPageData(rt, pageItemCount, p, &m.whereInfo)
 	if err != nil {
-		dialog.ShowError(fmt.Errorf("获取数据库档案信息错误。"), window)
+		dialog.ShowError(fmt.Errorf("获取数据库档案信息错误。"), m.window.window)
 		return
 	}
 
-	InfoFile = files
+	m.InfoFile = files
 
-	UpdateTableInfo(rt, files)
-	ChangePageMenuItem(rt, window, table, pageItemCount, p, pageMax, fmt.Sprintf("本页共显示数据:%d条。", len(files)))
-	table.Refresh()
+	m.UpdateTableInfo(rt, files)
+	m.window.menu.ChangePageMenuItem(rt, pageItemCount, p, pageMax, fmt.Sprintf("本页共显示数据:%d条。", len(files)))
+	m.fileTable.Refresh()
 }
 
 func timeToStr(time sql.NullTime, NWord ...string) string {

+ 39 - 32
src/v1main/main.go

@@ -1,47 +1,28 @@
 package v1main
 
 import (
+	"errors"
 	"fmt"
+	"fyne.io/fyne/v2"
+	"fyne.io/fyne/v2/dialog"
+	"fyne.io/fyne/v2/widget"
 	happ "github.com/SuperH-0630/hdangan/src/app"
-	"github.com/SuperH-0630/hdangan/src/assest"
-	"github.com/SuperH-0630/hdangan/src/fail"
 	"github.com/SuperH-0630/hdangan/src/model"
 	"github.com/SuperH-0630/hdangan/src/runtime"
-	"github.com/flopp/go-findfont"
+	"github.com/SuperH-0630/hdangan/src/systeminit"
 	"os"
-	"strings"
 )
 
-var FONT_NAME = ""
-
-// ALLOW_FONT_NAME 常见字体:宋体(SimSun, STSong)、(SimHei, STHei)、微软雅黑(Microsoft YaHei)、Linux的其他字体
-var ALLOW_FONT_NAME = []string{"Dengb.ttf", "Deng.ttf", "Dengl.ttf", "KaiTi.ttf", "SimSun.ttc", "STSong.ttf", "SimHei.ttc", "STHei.ttf", "Microsoft YaHei",
-	"WenQuanYi", "Source", "Fangzheng", "Arphic", "AR PL", "ZCOOL"}
-
-func init() {
-	fontPaths := findfont.List()
-	for _, path := range fontPaths {
-		for _, n := range ALLOW_FONT_NAME {
-			if strings.Contains(strings.ToLower(path), strings.ToLower(n)) {
-				FONT_NAME = path
-				return
-			}
-		}
-	}
-	fail.ToFail("Font not found.")
-}
-
 func Main() {
 	start()
 
 	a := happ.NewApp()
-	a.SetIcon(assest.MainIco)
 
 	rt := runtime.NewRunTime(a)
 
 	err := model.AutoCreateModel(rt)
 	if err != nil {
-		fail.ToFail(fmt.Sprintf("数据库构建失败: %s。", err.Error()))
+		dbFail(rt, fmt.Sprintf("数据库构建失败: %s。", err.Error()), 1)
 		return
 	}
 
@@ -54,14 +35,40 @@ func Main() {
 }
 
 func start() {
-	err := os.Setenv("FYNE_FONT", FONT_NAME)
-	if err != nil {
-		fail.ToFail("font setting failed. 字体设置失败。")
-		return
-	}
+	fmt.Println("START")
 }
 
 func exit() {
-	_ = os.Unsetenv("FYNE_FONT")
-	fmt.Print("EXIT")
+	fmt.Println("EXIT")
+}
+
+func dbFail(rt runtime.RunTime, res string, exitCode int) {
+	defer func() {
+		if exitCode <= 0 {
+			exitCode = 1
+		}
+
+		os.Exit(exitCode)
+	}()
+
+	w1 := rt.App().NewWindow("数据库错误")
+
+	w1.Resize(fyne.NewSize(300, 300))
+
+	var msg string
+	d, err := systeminit.GetInit()
+	if errors.Is(err, systeminit.LuckyError) {
+		msg = fmt.Sprintf("I am sorry, that we has miss some wrong.\n%s\n\n\n寻求帮助:怨天由人", res)
+	} else if err == nil {
+		msg = fmt.Sprintf("I am sorry, that we has miss some wrong.\n%s\n\n\n寻求帮助:%s <%s>", res, d.Yaml.Report.Name, d.Yaml.Report.Email)
+	} else {
+		msg = fmt.Sprintf("I am sorry, that we has miss some wrong.\n%s", res)
+	}
+
+	dialog.ShowError(fmt.Errorf("%s", msg), w1)
+
+	w1.SetContent(widget.NewLabel(""))
+	w1.CenterOnScreen()
+	w1.SetFixedSize(true)
+	w1.Show()
 }

+ 6 - 5
src/v1main/move.go

@@ -9,7 +9,6 @@ import (
 	"fyne.io/fyne/v2/dialog"
 	"fyne.io/fyne/v2/layout"
 	"fyne.io/fyne/v2/widget"
-	"github.com/SuperH-0630/hdangan/src/fail"
 	"github.com/SuperH-0630/hdangan/src/model"
 	"github.com/SuperH-0630/hdangan/src/runtime"
 	"github.com/SuperH-0630/hdangan/src/systeminit"
@@ -19,7 +18,10 @@ import (
 func ShowMove(rt runtime.RunTime, f *model.File, refresh func(rt runtime.RunTime)) {
 	config, err := systeminit.GetInit()
 	if errors.Is(err, systeminit.LuckyError) {
-		fail.ToFail(err.Error())
+		rt.DBConnectError(err)
+		return
+	} else if err != nil {
+		rt.DBConnectError(fmt.Errorf("配置文件错误,请检查配置文件状态。"))
 		return
 	}
 
@@ -27,7 +29,6 @@ func ShowMove(rt runtime.RunTime, f *model.File, refresh func(rt runtime.RunTime
 
 	infoWindow.SetOnClosed(func() {
 		rt.Action()
-		WinClose(infoWindow)
 		infoWindow = nil
 	})
 	infoWindow.SetCloseIntercept(func() {
@@ -140,8 +141,8 @@ func ShowMove(rt runtime.RunTime, f *model.File, refresh func(rt runtime.RunTime
 	box := container.NewVBox(upBox, gg, downCenterBox)
 	cbox := container.NewCenter(box)
 
-	bg := NewBg(max(cbox.MinSize().Width, cbox.Size().Width, 220),
-		max(cbox.MinSize().Height, cbox.Size().Height, 280))
+	bg := NewBg(fmax(cbox.MinSize().Width, cbox.Size().Width, 220),
+		fmax(cbox.MinSize().Height, cbox.Size().Height, 280))
 
 	lastContainer := container.NewStack(bg, cbox)
 	infoWindow.SetContent(lastContainer)

+ 9 - 8
src/v1main/new.go

@@ -8,7 +8,6 @@ import (
 	"fyne.io/fyne/v2/dialog"
 	"fyne.io/fyne/v2/layout"
 	"fyne.io/fyne/v2/widget"
-	"github.com/SuperH-0630/hdangan/src/fail"
 	"github.com/SuperH-0630/hdangan/src/model"
 	"github.com/SuperH-0630/hdangan/src/runtime"
 	"github.com/SuperH-0630/hdangan/src/systeminit"
@@ -19,7 +18,10 @@ import (
 func ShowNew(rt runtime.RunTime, refresh func(rt runtime.RunTime)) {
 	config, err := systeminit.GetInit()
 	if errors.Is(err, systeminit.LuckyError) {
-		fail.ToFail(err.Error())
+		rt.DBConnectError(err)
+		return
+	} else if err != nil {
+		rt.DBConnectError(fmt.Errorf("配置文件错误,请检查配置文件状态。"))
 		return
 	}
 
@@ -27,7 +29,6 @@ func ShowNew(rt runtime.RunTime, refresh func(rt runtime.RunTime)) {
 
 	newWindow.SetOnClosed(func() {
 		rt.Action()
-		WinClose(newWindow)
 		newWindow = nil
 	})
 	newWindow.SetCloseIntercept(func() {
@@ -128,15 +129,15 @@ func ShowNew(rt runtime.RunTime, refresh func(rt runtime.RunTime)) {
 	box := container.NewVBox(upBox, gg, downCenterBox)
 	cbox := container.NewCenter(box)
 
-	bg := NewBg(max(cbox.MinSize().Width, cbox.Size().Width, 220),
-		max(cbox.MinSize().Height, cbox.Size().Height, 360))
+	bg := NewBg(fmax(cbox.MinSize().Width, cbox.Size().Width, 220),
+		fmax(cbox.MinSize().Height, cbox.Size().Height, 360))
 
 	lastContainer := container.NewStack(bg, cbox)
 
 	newWindow.SetContent(lastContainer)
-
 	newWindow.Show()
 	newWindow.CenterOnScreen()
+	newWindow.SetFixedSize(true)
 }
 
 func checkNewFile(f *model.File) error {
@@ -199,7 +200,7 @@ func newFileIDEntry4(data string, input *int64) *widget.Entry {
 	entry := widget.NewEntry()
 	entry.Text = data
 	entry.Validator = func(s string) error {
-		n, err := strconv.ParseInt(s, 0, 64)
+		n, err := strconv.ParseInt(s, 10, 64)
 		if err != nil {
 			return err
 		}
@@ -213,7 +214,7 @@ func newFileIDEntry4(data string, input *int64) *widget.Entry {
 
 	entry.OnChanged = func(s string) {
 		if entry.Validate() == nil {
-			n, err := strconv.ParseInt(s, 64, 10)
+			n, err := strconv.ParseInt(s, 10, 64)
 			if err == nil {
 				*input = n
 			}

+ 4 - 4
src/v1main/record.go

@@ -37,18 +37,17 @@ func CreateRecordWindow(rt runtime.RunTime, f *model.File, fileWindow fyne.Windo
 
 	CreateRecordTable(rt, w)
 	GetMainMenuRecord(rt, w, func(rt runtime.RunTime) {
-		w.Table.UpdateTableRecord(rt, 0, NowPage)
+		w.Table.UpdateTableRecord(rt, 0, w.NowPage)
 	})
 
-	bg := NewBg(max(w.Table.Table.MinSize().Width, w.Table.Table.Size().Width, 600),
-		max(w.Table.Table.MinSize().Height, w.Table.Table.Size().Height, 400))
+	bg := NewBg(fmax(w.Table.Table.MinSize().Width, w.Table.Table.Size().Width, 600),
+		fmax(w.Table.Table.MinSize().Height, w.Table.Table.Size().Height, 400))
 
 	lastContainer := container.NewStack(bg, w.Table.Table)
 	w.Window.SetContent(lastContainer)
 
 	w.Window.SetOnClosed(func() {
 		rt.Action()
-		WinClose(w.Window)
 		w.Window = nil
 	})
 
@@ -59,6 +58,7 @@ func CreateRecordWindow(rt runtime.RunTime, f *model.File, fileWindow fyne.Windo
 	})
 
 	w.Table.FirstUpdateData(rt)
+	w.Window.SetFixedSize(true)
 	return w
 }
 

+ 3 - 3
src/v1main/recordinfo.go

@@ -78,7 +78,6 @@ func ShowRecordInfo(rt runtime.RunTime, recordTableWindow fyne.Window, fileWindo
 
 	infoWindow.SetOnClosed(func() {
 		rt.Action()
-		WinClose(infoWindow)
 		infoWindow = nil
 	})
 	infoWindow.SetCloseIntercept(func() {
@@ -116,12 +115,13 @@ func ShowRecordInfo(rt runtime.RunTime, recordTableWindow fyne.Window, fileWindo
 	box := container.NewVBox(upBox, gg, downCenterBox)
 	cbox := container.NewCenter(box)
 
-	bg := NewBg(max(cbox.MinSize().Width, cbox.Size().Width, 500),
-		max(cbox.MinSize().Height, cbox.Size().Height, 300))
+	bg := NewBg(fmax(cbox.MinSize().Width, cbox.Size().Width, 500),
+		fmax(cbox.MinSize().Height, cbox.Size().Height, 300))
 
 	lastContainer := container.NewStack(bg, cbox)
 	infoWindow.SetContent(lastContainer)
 
 	infoWindow.Show()
 	infoWindow.CenterOnScreen()
+	infoWindow.SetFixedSize(true)
 }

+ 4 - 4
src/v1main/recordtable.go

@@ -58,7 +58,7 @@ func CreateRecordTable(rt runtime.RunTime, w *RecordWindow) *RecordTable {
 	w.Table.Table.UpdateCell = func(id widget.TableCellID, object fyne.CanvasObject) {
 		l := object.(*widget.Label)
 		l.SetText(w.Table.Record.InfoDataRecord[id.Row][id.Col])
-		w.Table.Width[id.Col] = max(w.Table.Width[id.Col], l.Size().Width, l.MinSize().Width)
+		w.Table.Width[id.Col] = fmax(w.Table.Width[id.Col], l.Size().Width, l.MinSize().Width)
 		w.Table.Table.SetColumnWidth(id.Col, w.Table.Width[id.Col])
 	}
 
@@ -70,12 +70,12 @@ func CreateRecordTable(rt runtime.RunTime, w *RecordWindow) *RecordTable {
 		if id.Row == -1 {
 			l := template.(*widget.Label)
 			l.SetText(TopHeaderDataRecord[id.Col])
-			w.Table.Width[id.Col] = max(w.Table.Width[id.Col], l.Size().Width, l.MinSize().Width)
+			w.Table.Width[id.Col] = fmax(w.Table.Width[id.Col], l.Size().Width, l.MinSize().Width)
 			w.Table.Table.SetColumnWidth(id.Col, w.Table.Width[id.Col])
 		} else if id.Col == -1 {
 			l := template.(*widget.Label)
 			l.SetText(fmt.Sprintf("%02d", id.Row+1)) // 从1开始
-			w.Table.IdWidth = max(w.Table.IdWidth, l.Size().Width, l.MinSize().Width)
+			w.Table.IdWidth = fmax(w.Table.IdWidth, l.Size().Width, l.MinSize().Width)
 			w.Table.Table.SetColumnWidth(-1, w.Table.IdWidth)
 		}
 	}
@@ -86,7 +86,7 @@ func CreateRecordTable(rt runtime.RunTime, w *RecordWindow) *RecordTable {
 			if id.Row >= 0 && id.Row < len(w.Table.Record.InfoRecord) {
 				record := w.Table.Record.InfoRecord[id.Row]
 				ShowRecordInfo(rt, w.Table.Record.Window, w.Table.Record.FileWindow, w.Table.Record.File, &record, func(rt runtime.RunTime) {
-					w.Table.UpdateTableRecord(rt, 0, NowPage)
+					w.Table.UpdateTableRecord(rt, 0, w.NowPage)
 				})
 			}
 		}

+ 8 - 7
src/v1main/savewhererecord.go

@@ -9,7 +9,6 @@ import (
 	"fyne.io/fyne/v2/dialog"
 	"fyne.io/fyne/v2/layout"
 	"fyne.io/fyne/v2/widget"
-	"github.com/SuperH-0630/hdangan/src/fail"
 	"github.com/SuperH-0630/hdangan/src/model"
 	"github.com/SuperH-0630/hdangan/src/runtime"
 	"github.com/SuperH-0630/hdangan/src/systeminit"
@@ -35,7 +34,10 @@ func NewSaveWhereWindow(rt runtime.RunTime, download func(rt runtime.RunTime, w
 func (w *SaveWhereWindow) create(rt runtime.RunTime) {
 	config, err := systeminit.GetInit()
 	if errors.Is(err, systeminit.LuckyError) {
-		fail.ToFail(err.Error())
+		rt.DBConnectError(err)
+		return
+	} else if err != nil {
+		rt.DBConnectError(fmt.Errorf("配置文件错误,请检查配置文件状态。"))
 		return
 	}
 
@@ -43,7 +45,6 @@ func (w *SaveWhereWindow) create(rt runtime.RunTime) {
 
 	w.Window.SetOnClosed(func() {
 		rt.Action()
-		WinClose(w.Window)
 		w.Window = nil
 	})
 	w.Window.SetCloseIntercept(func() {
@@ -119,8 +120,8 @@ func (w *SaveWhereWindow) create(rt runtime.RunTime) {
 	box := container.NewVBox(upBox, gg, downCenterBox)
 	cbox := container.NewCenter(box)
 
-	bg := NewBg(max(cbox.MinSize().Width, cbox.Size().Width, 600),
-		max(cbox.MinSize().Height, cbox.Size().Height, 350))
+	bg := NewBg(fmax(cbox.MinSize().Width, cbox.Size().Width, 600),
+		fmax(cbox.MinSize().Height, cbox.Size().Height, 350))
 
 	lastContainer := container.NewStack(bg, cbox)
 	w.Window.SetContent(lastContainer)
@@ -161,7 +162,7 @@ func newFileIDEntry6(input *int64) *widget.Entry {
 			return nil
 		}
 
-		n, err := strconv.ParseInt(s, 0, 64)
+		n, err := strconv.ParseInt(s, 10, 64)
 		if err != nil {
 			return err
 		}
@@ -180,7 +181,7 @@ func newFileIDEntry6(input *int64) *widget.Entry {
 
 	entry.OnChanged = func(s string) {
 		if entry.Validate() == nil {
-			n, err := strconv.ParseInt(s, 64, 10)
+			n, err := strconv.ParseInt(s, 10, 64)
 			if err == nil {
 				*input = n
 			}

+ 23 - 17
src/v1main/where.go

@@ -9,7 +9,6 @@ import (
 	"fyne.io/fyne/v2/dialog"
 	"fyne.io/fyne/v2/layout"
 	"fyne.io/fyne/v2/widget"
-	"github.com/SuperH-0630/hdangan/src/fail"
 	"github.com/SuperH-0630/hdangan/src/model"
 	"github.com/SuperH-0630/hdangan/src/runtime"
 	"github.com/SuperH-0630/hdangan/src/systeminit"
@@ -23,7 +22,10 @@ var whereWindow fyne.Window
 func createWindow(rt runtime.RunTime, target *model.SearchWhere, refresh func(rt runtime.RunTime)) {
 	config, err := systeminit.GetInit()
 	if errors.Is(err, systeminit.LuckyError) {
-		fail.ToFail(err.Error())
+		rt.DBConnectError(err)
+		return
+	} else if err != nil {
+		rt.DBConnectError(fmt.Errorf("配置文件错误,请检查配置文件状态。"))
 		return
 	}
 
@@ -32,7 +34,6 @@ func createWindow(rt runtime.RunTime, target *model.SearchWhere, refresh func(rt
 
 	whereWindow.SetOnClosed(func() {
 		rt.Action()
-		WinClose(whereWindow)
 		whereWindow = nil
 	})
 	whereWindow.SetCloseIntercept(func() {
@@ -140,8 +141,8 @@ func createWindow(rt runtime.RunTime, target *model.SearchWhere, refresh func(rt
 	box := container.NewVBox(upBox, gg, downCenterBox)
 	cbox := container.NewCenter(box)
 
-	bg := NewBg(max(cbox.MinSize().Width, cbox.Size().Width, 600),
-		max(cbox.MinSize().Height, cbox.Size().Height, 350))
+	bg := NewBg(fmax(cbox.MinSize().Width, cbox.Size().Width, 600),
+		fmax(cbox.MinSize().Height, cbox.Size().Height, 350))
 
 	lastContainer := container.NewStack(bg, cbox)
 	whereWindow.SetContent(lastContainer)
@@ -176,14 +177,18 @@ func newEntry3(input *string) *widget.Entry {
 
 func newFileIDEntry3(input *int64) *widget.Entry {
 	entry := widget.NewEntry()
-	entry.SetText(fmt.Sprintf("%d", *input))
+	if *input <= 0 {
+		entry.Text = ""
+	} else {
+		entry.Text = fmt.Sprintf("%d", *input)
+	}
 
 	entry.Validator = func(s string) error {
-		if s == "" {
+		if len(s) == 0 {
 			return nil
 		}
 
-		n, err := strconv.ParseInt(s, 0, 64)
+		n, err := strconv.ParseInt(s, 10, 64)
 		if err != nil {
 			return err
 		}
@@ -195,21 +200,22 @@ func newFileIDEntry3(input *int64) *widget.Entry {
 		return nil
 	}
 
-	if entry.Validate() != nil {
-		entry.SetText("")
-		*input = 0
-	}
-
 	entry.OnChanged = func(s string) {
 		if entry.Validate() == nil {
-			n, err := strconv.ParseInt(s, 64, 10)
-			if err == nil {
-				*input = n
+			if len(s) == 0 {
+				*input = 0
+			} else {
+				n, err := strconv.ParseInt(s, 10, 64)
+				if err == nil {
+					*input = n
+				} else {
+					*input = 0
+				}
 			}
 		}
 	}
 
-	entryList3 = append(entryList3, entry)
+	entryList = append(entryList, entry)
 	return entry
 }
 

+ 7 - 6
src/v1main/whererecord.go

@@ -9,7 +9,6 @@ import (
 	"fyne.io/fyne/v2/dialog"
 	"fyne.io/fyne/v2/layout"
 	"fyne.io/fyne/v2/widget"
-	"github.com/SuperH-0630/hdangan/src/fail"
 	"github.com/SuperH-0630/hdangan/src/model"
 	"github.com/SuperH-0630/hdangan/src/runtime"
 	"github.com/SuperH-0630/hdangan/src/systeminit"
@@ -37,7 +36,10 @@ func NewWhereWindow(rt runtime.RunTime, rw *RecordWindow, refresh func(rt runtim
 func (w *WhereWindow) create(rt runtime.RunTime) {
 	config, err := systeminit.GetInit()
 	if errors.Is(err, systeminit.LuckyError) {
-		fail.ToFail(err.Error())
+		rt.DBConnectError(err)
+		return
+	} else if err != nil {
+		rt.DBConnectError(fmt.Errorf("配置文件错误,请检查配置文件状态。"))
 		return
 	}
 
@@ -45,7 +47,6 @@ func (w *WhereWindow) create(rt runtime.RunTime) {
 
 	w.Window.SetOnClosed(func() {
 		rt.Action()
-		WinClose(w.Window)
 		w.Window = nil
 	})
 	w.Window.SetCloseIntercept(func() {
@@ -123,8 +124,8 @@ func (w *WhereWindow) create(rt runtime.RunTime) {
 	box := container.NewVBox(upBox, gg, downCenterBox)
 	cbox := container.NewCenter(box)
 
-	bg := NewBg(max(cbox.MinSize().Width, cbox.Size().Width, 600),
-		max(cbox.MinSize().Height, cbox.Size().Height, 350))
+	bg := NewBg(fmax(cbox.MinSize().Width, cbox.Size().Width, 600),
+		fmax(cbox.MinSize().Height, cbox.Size().Height, 350))
 
 	lastContainer := container.NewStack(bg, cbox)
 	w.Window.SetContent(lastContainer)
@@ -165,7 +166,7 @@ func newFileIDEntry5(input *int64) *widget.Entry {
 			return nil
 		}
 
-		n, err := strconv.ParseInt(s, 0, 64)
+		n, err := strconv.ParseInt(s, 10, 64)
 		if err != nil {
 			return err
 		}

Some files were not shown because too many files changed in this diff